"No hay suficiente información para inferir el parámetro T" con Kotlin y Android

Estoy intentando replicar el siguiente ListView en mi aplicación de Android usando Kotlin: https://github.com/bidrohi/KotlinListView .

Lamentablemente, recibo un error que no puedo resolver por mi count. Aquí está mi 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 } } } 

Los layouts son exactamente como aquí: https://github.com/bidrohi/KotlinListView/tree/master/app/src/main/res/layout

El post de error completo que recibo es este: Error: (92, 31) Falló la inferencia de tipo: No hay suficiente información para inferir el parámetro T en la diversión findViewById (p0: Int): T! Por favor especifíquelo explícitamente.

Agradecería cualquier ayuda que pueda get.

Debe utilizar el nivel 26 de la API. Esta versión ha cambiado la firma de View.findViewById() – consulte aquí https://developer.android.com/preview/api-overview.html#fvbi-signature

Entonces, en su caso, donde el resultado de findViewById es ambiguo, debe proporcionar el tipo:

1 / Cambiar

val listView = findViewById(R.id.list) as ListView a

val listView = findViewById<ListView>(R.id.list)

2 / Cambiar

this.label = row?.findViewById(R.id.label) as TextView to

this.label = row?.findViewById<TextView>(R.id.label) as TextView

Tenga en count que en 2 / el lanzamiento solo es necesario porque la row es anulable. Si la label se puede anular, o si hizo que la row no acepte nulos, no sería necesario.

Andoid O cambiar findViewById api de

public View findViewById (int id);

a

final público T findViewById (int id)

Entonces, si eres objective de la API 26, puedes cambiar

val listView = findViewById (R.id.list) como ListView

a

val listView = findViewById (R.id.list)

o

val listView: ListView = findViewById (R.id.list)

Cambia tu código a esto. Donde los cambios principales ocurrieron están marcados con asteriscos.

 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 }** } } 

Esta funcionando

Nivel de API 25 o inferior usa esto

  var et_user_name = findViewById(R.id.et_user_name) as EditText 

Nivel de API 26 o superior usa esto

  val et_user_name: EditText = findViewById(R.id.et_user_name) 

Feliz Codificación!

Le sugiero que use synthetics extensión de Android kotlin de synthetics :

https://kotlinlang.org/docs/tutorials/android-plugin.html

https://antonioleiva.com/kotlin-android-extensions/

En tu caso, el código será algo como esto:

 init { this.label = row.label } 

Tan sencillo como eso 😉

  • Uso de la expansión de propiedad Gradle en Kotlin / Spring Boot
  • While loop en el lenguaje de progtwigción Kotlin
  • Copiando un file automáticamente con un pom
  • No se puede comprimir Rxjava Observables
  • ¿Por qué Kotlin no siguió la syntax de Java?
  • Dagger no genera componentes para Android Test
  • Cómo mantener la reference del object de class singleton en el object complementario, Kotlin
  • > No se pudo aplicar el complemento > Para la cadena de input: ""
  • Kotlin: lambda nunca comstack
  • serializar con gson y volver no funciona con types generics
  • ¿Cómo no sobrescribir datos con onDataChange?