RecycleView
by id 를 찾으려고하면 다음과 같은 오류가 발생 합니다.
오류 :-
유형 추론 실패 : 매개 변수 T 를 추론하기에 정보가 충분하지 않습니다.
암호:
class FirstRecycleViewExample : AppCompatActivity() {
val data = arrayListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_recycleview)
val recycler_view = findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR
data.add("First Data")
data.add("Second Data")
data.add("Third Data")
data.add("Forth Data")
data.add("Fifth Data")
//creating our adapter
val adapter = CustomRecycleAdapter(data)
//now adding the adapter to recyclerview
recycler_view.adapter = adapter
}
}
답변
다음과 같이 시도하십시오.
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
당신 Kotlin Android Extensions
도 그것을 위해 사용할 수 있습니다 . 여기 에서 문서를 확인 하십시오 .
이를 recycler_view
통해 코드에서 직접 호출 할 수 있습니다 .
Kotlin Android 확장 :
- 앱에서
gradle.build
추가apply plugin: 'kotlin-android-extensions'
- 클래스
import kotlinx.android.synthetic.main.<layout>.*
에서<layout>
레이아웃의 파일 이름이 어디에 있는지 가져 오기를 추가 하십시오. - 그게 전부
recycler_view
입니다. 코드에서 직접 호출 할 수 있습니다 .
어떻게 작동합니까? 처음 호출 recycler_view
하면에 대한 호출 findViewById
이 수행되고 캐시 됩니다.
답변
이제의 반환 유형이 대신 findViewById
제네릭 이므로 추론 할 수 있는 API 레벨 26에 있습니다. 여기 에서 관련 변경 로그를 볼 수 있습니다 .T
View
따라서 다음을 수행 할 수 있어야합니다.
val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
아니면 이거:
val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
답변
에서 Kotlin
우리의 사용하지 않고 뷰의 ID를 얻을 수 있습니다 findViewById
구문.
예를 들어 다음 레이아웃을 사용하여 뷰의 ID를 가져오고 작업을 수행합니다.
형세
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/welcomeMessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Hello World!"/>
</FrameLayout>
다음 코드를 사용하여 뷰의 ID를 찾을 수 있습니다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax
}
어떻게?
이를 사용하려면 특수 가져 오기 (아래에 작성)가 필요하지만 IDE는이를 자동으로 가져올 수 있습니다. 이보다 쉬울 수는 없습니다!
import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView()
findviewbyid
구문을 사용하지 않고 뷰의 ID를 가져 오려면이 속성을 가져와야 합니다.
이 주제에 대한 자세한 내용은이 링크를 참조하십시오.- 여기를 클릭하십시오.
답변
일반적으로 Kotlin은 괄호 안에 제공된 정보를 사용하여 유형을 추론 할 수 있습니다.
이 경우에는 그렇게 할 수 없으므로 다음과 같이 명시 적으로 지정해야합니다.
findViewById<RecyclerView>(R.id.recycler_view)
유형에 대해서는 확실하지 않지만 지정하는 방법입니다.
Anko를 사용 하여 다음과 같이 코드를 더욱 단순화 할 수 있습니다.
val recycler_view : RecyclerView = find(R.id.recycler_view)
답변
코드에이 줄을 Whatever you are using controller로 추가합니다.
val tvHello = findViewById<TextView>(R.id.tvHello)
답변
kotlin의 변수에 ID를 제공하는 것을 무시할 수 있습니다. 플러그인을 사용하면됩니다.
이것을 gradle에 붙여 넣으십시오.
apply plugin: 'kotlin-android-extensions'
그런 다음 var에 ID를 할당 할 필요가 없습니다. 다음과 같이 할 수 있습니다.
recycler_view.setAdapter(youradapter);
답변
이 시도:
여기에 bind
일반 함수를 사용하여 뷰를 바인딩합니다. 모든 뷰에 사용할 수있는 일반적인 기능입니다.
class MyActivity : AppCompatActivity() {
private lateinit var recycler_view : RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
...
recycler_view = bind(R.id.recycler_view)
}
}
fun <T : View> Activity.bind(@IdRes res : Int) : T {
@Suppress("UNCHECKED_CAST")
return findViewById(res) as T
}