Ich versuche, die folgende ListView in meiner Android-App mit Kotlin zu replizieren: https://github.com/bidrohi/KotlinListView .
Leider erhalte ich einen Fehler, den ich nicht selbst beheben kann. Hier ist mein Code:
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
}
}
}
Die Layouts sind genau wie hier: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout
Die vollständige Fehlermeldung, die ich erhalte, lautet wie folgt: Fehler: (92, 31) Typinferenz fehlgeschlagen: Nicht genügend Informationen, um Parameter T im Spaß abzuleiten findViewById (p0: Int): T! Bitte geben Sie dies ausdrücklich an.
Ich würde mich über jede Hilfe freuen, die ich bekommen kann.
android
kotlin
android-8.0-oreo
Timo Güntner
quelle
quelle
this.label = ... as TextView
zuthis.label = row?.findViewById<TextView>
und analog zu wechselnval listView = ...
? Bitte lassen Sie mich wissen, ob dies funktioniert, damit ich in diesem Fall eine richtige Antwort geben kann.Antworten:
Sie müssen API Level 26 (oder höher) verwenden. Diese Version hat die Signatur von geändert
View.findViewById()
- siehe hier https://developer.android.com/about/versions/oreo/android-8.0-changes#fvbi-signatureIn Ihrem Fall, in dem das Ergebnis von nicht
findViewById
eindeutig ist, müssen Sie den Typ angeben:1 / Ändern
val listView = findViewById(R.id.list) as ListView
zuval listView = findViewById<ListView>(R.id.list)
2 / Ändern
this.label = row?.findViewById(R.id.label) as TextView
zuthis.label = row?.findViewById<TextView>(R.id.label) as TextView
Beachten Sie, dass in 2 / die Besetzung nur erforderlich ist, weil sie
row
nullbar ist. Wennlabel
es auch nullbar wäre oder wenn Sie esrow
nicht nullbar gemacht hätten, wäre es nicht erforderlich.quelle
findViewById\((.+?)\)\s+as\s+(.+)
durchfindViewById<$2>\($1\)
und führen Sie das Ersetzen für alle Dateien aus. Es hat fast alle meine Fehler gelöst.findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));
Dies ist in Ordnung für Java.findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)
funktioniert besser für mich. Es verhindert, dass ein einzeiliger Code nicht über @GustavKarlssonAndoid O ändere findViewById API von
zu
Wenn Sie also auf API 26 abzielen, können Sie Änderungen vornehmen
zu
oder
quelle
Es funktioniert
API Level 25 oder niedriger verwenden dies
API Level 26 oder höher verwenden dies
Viel Spaß beim Codieren!
quelle
Ändern Sie Ihren Code in diesen. Wo die Hauptänderungen aufgetreten sind, sind mit Sternchen markiert.
quelle
val listView = findViewById<ListView>(R.id.list)
Ich würde Ihnen empfehlen, die
synthetics
kotlin Android-Erweiterung zu verwenden:https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
In Ihrem Fall lautet der Code ungefähr so:
So einfach ist das ;)
quelle