Saya mencoba mereplikasi ListView berikut di aplikasi Android saya menggunakan Kotlin: https://github.com/bidrohi/KotlinListView .
Sayangnya, saya mendapatkan kesalahan yang tidak dapat saya atasi sendiri. Ini kode saya:
MainActivity.kt:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById(R.id.list) as ListView
listView.adapter = ListExampleAdapter(this)
}
private class ListExampleAdapter(context: Context) : BaseAdapter() {
internal var sList = arrayOf("Eins", "Zwei", "Drei")
private val mInflator: LayoutInflater
init {
this.mInflator = LayoutInflater.from(context)
}
override fun getCount(): Int {
return sList.size
}
override fun getItem(position: Int): Any {
return sList[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
val view: View?
val vh: ListRowHolder
if(convertView == null) {
view = this.mInflator.inflate(R.layout.list_row, parent, false)
vh = ListRowHolder(view)
view.tag = vh
} else {
view = convertView
vh = view.tag as ListRowHolder
}
vh.label.text = sList[position]
return view
}
}
private class ListRowHolder(row: View?) {
public val label: TextView
init {
this.label = row?.findViewById(R.id.label) as TextView
}
}
}
Layoutnya persis seperti di sini: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout
Pesan kesalahan lengkap yang saya dapatkan adalah ini: Kesalahan: (92, 31) Jenis inferensi gagal: Tidak cukup informasi untuk menyimpulkan parameter T dalam fun findViewById (p0: Int): T! Harap sebutkan secara eksplisit.
Saya menghargai bantuan yang bisa saya dapatkan.
android
kotlin
android-8.0-oreo
Timo Güntner
sumber
sumber
this.label = ... as TextView
kethis.label = row?.findViewById<TextView>
dan melakukannya secara analogval listView = ...
? Tolong beri tahu saya jika ini berfungsi sehingga saya dapat membuat ini jawaban yang tepat dalam kasus itu.Jawaban:
Anda harus menggunakan API level 26 (atau lebih tinggi). Versi ini telah mengubah tanda tangan
View.findViewById()
- lihat di sini https://developer.android.com/about/versions/oreo/android-8.0-changes#fvbi-signatureJadi dalam kasus Anda, di mana hasil dari
findViewById
ambigu, Anda perlu memberikan tipe:1 / Ubah
val listView = findViewById(R.id.list) as ListView
untukval listView = findViewById<ListView>(R.id.list)
2 / Ubah
this.label = row?.findViewById(R.id.label) as TextView
untukthis.label = row?.findViewById<TextView>(R.id.label) as TextView
Perhatikan bahwa di 2 / cast hanya diperlukan karena
row
nullable. Jikalabel
juga nullable, atau jika Anda menjadikannyarow
tidak null, tidak akan diperlukan.sumber
findViewById\((.+?)\)\s+as\s+(.+)
denganfindViewById<$2>\($1\)
dan jalankan ganti pada semua file. Itu memecahkan hampir semua kesalahan saya.findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));
ini OK untuk Java.findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)
bekerja lebih baik untuk saya. Ini mencegah beberapa kode baris tidak berakhir @GustavKarlssonAndoid O mengubah api findViewById dari
untuk
jadi, jika Anda menargetkan API 26, Anda bisa mengubahnya
untuk
atau
sumber
Bekerja
API Level 25 atau di bawahnya gunakan ini
API Level 26 atau Di Atas gunakan ini
Selamat Coding!
sumber
Ubah kode Anda menjadi ini. Tempat terjadinya perubahan utama ditandai dengan tanda bintang.
sumber
val listView = findViewById<ListView>(R.id.list)
Saya menyarankan Anda untuk menggunakan
synthetics
ekstensi Android kotlin:https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
Dalam kasus Anda, kodenya akan menjadi seperti ini:
Sesimpel itu ;)
sumber