"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 😉

  • ¿Qué uso es "?" En ArrayList <String?>
  • ¿Por qué es posible omitir los valores pnetworkingeterminados en las funciones de miembro reemplazadas de los subtypes?
  • Kotlin Dagger 2 no puede proporcionar Interactor
  • Tipo no coincidente: ¿tipo inferido es FragmentActivity? pero se esperaba Context al actualizar la biblioteca de soporte a 27.0.0
  • biblioteca kotlin que puede hacer connection httpS sin verificación de certificate (como curl --insecure)
  • Kotlin Annotation IntDef
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • Cómo usar Data Binding y Kotlin en Android Studio 3.0.0
  • ViewPager en Fragment no está funcionando por segunda vez
  • Sitio de Android: cada variable de enlace en la consulta debe tener un método de coincidencia
  • Reasignar variables a través de la desestructuración