Estou tentando replicar o seguinte ListView em meu aplicativo Android usando Kotlin: https://github.com/bidrohi/KotlinListView .
Infelizmente, estou recebendo um erro que não consigo resolver sozinho. Este é o meu código:
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
}
}
}
Os layouts são exatamente como aqui: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout
A mensagem de erro completa que estou recebendo é esta: Erro: (92, 31) Falha na inferência de tipo: Não há informações suficientes para inferir o parâmetro T em fun findViewById (p0: Int): T! Por favor, especifique explicitamente.
Agradeço qualquer ajuda que puder obter.
android
kotlin
android-8.0-oreo
Timo Güntner
fonte
fonte
this.label = ... as TextView
parathis.label = row?.findViewById<TextView>
e fazer isso de forma análoga paraval listView = ...
? Informe se isso funciona para que eu possa dar uma resposta adequada nesse caso.Respostas:
Você deve usar a API de nível 26 (ou superior). Esta versão mudou a assinatura de
View.findViewById()
- veja aqui https://developer.android.com/about/versions/oreo/android-8.0-changes#fvbi-signaturePortanto, no seu caso, onde o resultado de
findViewById
é ambíguo, você precisa fornecer o tipo:1 / mudança
val listView = findViewById(R.id.list) as ListView
paraval listView = findViewById<ListView>(R.id.list)
2 / Mudar
this.label = row?.findViewById(R.id.label) as TextView
parathis.label = row?.findViewById<TextView>(R.id.label) as TextView
Observe que em 2 / o elenco só é necessário porque
row
é anulável. Se tambémlabel
fosse anulável, ou se você tornasserow
não anulável, não seria necessário.fonte
findViewById\((.+?)\)\s+as\s+(.+)
porfindViewById<$2>\($1\)
e execute a substituição em todos os arquivos. Isso resolveu quase todos os meus erros.findViewById(R.id.tabLayout).setOnClickListener(v-> Log.d(TAG, "login: "));
isso é bom para Java.findViewById\((.+?)\)\s+as\s+([A-Za-z0-9?]+)
funciona melhor para mim. Impede que o código de uma linha não termine @GustavKarlssonAndoid O alterar api findViewById de
para
então, se você tem como alvo a API 26, você pode mudar
para
ou
fonte
Está funcionando
API de nível 25 ou inferior usa isso
API de nível 26 ou superior usa isso
Happy Coding!
fonte
Mude seu código para isso. Os locais onde ocorreram as principais alterações estão marcados com asteriscos.
fonte
val listView = findViewById<ListView>(R.id.list)
Eu sugiro que você use a
synthetics
extensão kotlin do Android:https://kotlinlang.org/docs/tutorials/android-plugin.html
https://antonioleiva.com/kotlin-android-extensions/
No seu caso, o código será mais ou menos assim:
Tão simples como isso ;)
fonte