Я пытаюсь воспроизвести следующий ListView в своем приложении для Android с помощью Kotlin: https://github.com/bidrohi/KotlinListView .
К сожалению, я получаю сообщение об ошибке, которое не могу решить самостоятельно. Вот мой код:
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
}
}
}
Макеты точно такие же, как здесь: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout
Полное сообщение об ошибке, которое я получаю, выглядит так: Ошибка: (92, 31) Ошибка вывода типа: недостаточно информации для вывода параметра T в fun findViewById (p0: Int): T! Пожалуйста, укажите это явно.
Буду признателен за любую помощь, которую я могу получить.
android
kotlin
android-8.0-oreo
Тимо Гюнтнер
источник
источник
this.label = ... as TextView
наthis.label = row?.findViewById<TextView>
и сделать это аналогично дляval listView = ...
? Пожалуйста, дайте мне знать, работает ли это, чтобы я мог дать правильный ответ в этом случае.Ответы:
Вы должны использовать API уровня 26 (или выше). В этой версии была изменена подпись
View.findViewById()
- см. Здесь https://developer.android.com/about/versions/oreo/android-8.0-changes#fvbi-signatureИтак, в вашем случае, когда результат
findViewById
неоднозначен, вам необходимо указать тип:1 / Изменить
val listView = findViewById(R.id.list) as ListView
кval listView = findViewById<ListView>(R.id.list)
2 / Изменить
this.label = row?.findViewById(R.id.label) as TextView
кthis.label = row?.findViewById<TextView>(R.id.label) as TextView
Обратите внимание, что в 2 / приведение требуется только потому, что
row
допускает значение NULL. Еслиlabel
также допускалосьrow
значение NULL, или если вы сделали его не допускающим значение NULL, это не потребовалось бы.источник
findViewById\((.+?)\)\s+as\s+(.+)
наfindViewById<$2>\($1\)
и запустить замену для всех файлов. Он решил почти все мои ошибки.findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));
это нормально для Java.findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)
у меня работает лучше. Это препятствует тому, чтобы какой-то однострочный код не закончился @GustavKarlssonAndoid O изменить api findViewById с
к
Итак, если вы нацелены на API 26, вы можете изменить
к
или
источник
Это работает
Уровень API 25 или ниже используйте это
API уровня 26 или выше используйте это
Удачного кодирования!
источник
Измените свой код на этот. Звездочками отмечены места, где произошли основные изменения.
источник
val listView = findViewById<ListView>(R.id.list)
Я бы посоветовал вам использовать
synthetics
расширение kotlin для Android:https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
В вашем случае код будет примерно таким:
Так просто, как, что ;)
источник