"Недостаточно информации для вывода параметра T" с помощью Kotlin и Android
Я пытаюсь воспроизвести следующий 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 в удовольствие команду findViewById(Р0: Инт): Т! Пожалуйста, укажите это явно.
Я был бы признателен за любую помощь, которую я могу получить.
5 ответов:
вы должны использовать API уровня 26 (или выше). Эта версия изменила подпись
View.findViewById()
см. здесь https://developer.android.com/preview/api-overview.html#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
допускает. Еслиlabel
был слишком пустой, или если вы сделалиrow
не обнуляется, это не требуется.
Andoid O изменить findViewById api от
public View findViewById(int id);
до
public final T findViewById (int id)
Итак, если вы нацелены на API 26, Вы можете изменить
val listView = findViewById (R. id.list) как ListView
до
val listView = findViewById (R. id.list)
или
val listView: ListView = findViewById (R. id.list)
Его Работы
уровень API 25 или ниже используйте это
var et_user_name = findViewById(R.id.et_user_name) as EditText
уровень API 26 или выше используйте это
val et_user_name: EditText = findViewById(R.id.et_user_name)
Удачи В Кодировании !
измените свой код на этот. Где произошли основные изменения отмечены звездочками.
package com.phenakit.tg.phenakit import android.content.Context import android.os.Bundle import android.support.design.widget.BottomNavigationView import android.support.v7.app.AppCompatActivity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import android.widget.ListView import android.widget.TextView public class MainActivity : AppCompatActivity() { private var mTextMessage: TextView? = null private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> when (item.itemId) { R.id.navigation_home -> { mTextMessage!!.setText(R.string.title_home) return@OnNavigationItemSelectedListener true } R.id.navigation_dashboard -> { mTextMessage!!.setText(R.string.title_dashboard) return@OnNavigationItemSelectedListener true } R.id.navigation_notifications -> { setContentView(R.layout.activity_list_view) return@OnNavigationItemSelectedListener true } } false } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mTextMessage = findViewById(R.id.message) as TextView? val navigation = findViewById(R.id.navigation) as BottomNavigationView navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) **val listView = findViewById<ListView>(R.id.list)** **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 var label: TextView **init { this.label = row?.findViewById<TextView?>(R.id.label) as TextView }** } }
Я бы предложил вам использовать
synthetics
Котлин Android расширение:https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
в вашем случае код будет выглядеть примерно так:
init { this.label = row.label }
Так Просто ;)