Próbuję replikować następujący ListView w mojej aplikacji na Androida przy użyciu Kotlin: https://github.com/bidrohi/KotlinListView .
Niestety pojawia się błąd, którego nie mogę rozwiązać samodzielnie. Oto mój kod:
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
}
}
}
Układy są dokładnie takie, jak tutaj: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout
Pełny komunikat o błędzie, który otrzymuję, jest następujący: Błąd: (92, 31) Wnioskowanie o typie nie powiodło się: Za mało informacji, aby wywnioskować parametr T w fun findViewById (p0: Int): T! Określ to wyraźnie.
Byłbym wdzięczny za każdą pomoc, jaką mogę uzyskać.
android
kotlin
android-8.0-oreo
Timo Güntner
źródło
źródło
this.label = ... as TextView
nathis.label = row?.findViewById<TextView>
i zrobić to analogicznieval listView = ...
? Daj mi znać, czy to zadziała, więc w takim przypadku mogę podać poprawną odpowiedź.Odpowiedzi:
Musisz używać interfejsu API na poziomie 26 (lub wyższym). Ta wersja zmieniła sygnaturę
View.findViewById()
- patrz tutaj https://developer.android.com/about/versions/oreo/android-8.0-changes#fvbi-signatureWięc w twoim przypadku, gdy wynik
findViewById
jest niejednoznaczny, musisz podać typ:1 / Zmień
val listView = findViewById(R.id.list) as ListView
doval listView = findViewById<ListView>(R.id.list)
2 / Zmień
this.label = row?.findViewById(R.id.label) as TextView
dothis.label = row?.findViewById<TextView>(R.id.label) as TextView
Zauważ, że w 2 / rzutowanie jest wymagane tylko dlatego, że
row
dopuszcza wartość null. Gdyby teżlabel
była dopuszczalna, lub jeślirow
nie była dopuszczalna, nie byłaby wymagana.źródło
findViewById\((.+?)\)\s+as\s+(.+)
sięfindViewById<$2>\($1\)
i uruchom wymienić na wszystkich plikach. To rozwiązało prawie wszystkie moje błędy.findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));
to jest OK dla Java.findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)
działa lepiej dla mnie. Zapobiega to, że jeden wiersz kodu się nie skończył @GustavKarlssonAndoid O zmień api findViewById z
do
więc jeśli jesteś celem API 26, możesz to zmienić
do
lub
źródło
To działa
Użyj tego interfejsu API na poziomie 25 lub niższym
Użyj tego interfejsu API na poziomie 26 lub wyższym
Miłego kodowania!
źródło
Zmień swój kod na ten. Miejsca, w których zaszły główne zmiany, zaznaczono gwiazdkami.
źródło
val listView = findViewById<ListView>(R.id.list)
Sugerowałbym użycie
synthetics
rozszerzenia kotlin na Androida:https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
W twoim przypadku kod będzie wyglądał mniej więcej tak:
Tak proste jak to ;)
źródło