Recibo el siguiente error cuando intento encontrar un RecycleView
by id.
Error: - Error de inferencia de tipo: no hay suficiente información para inferir el parámetro T
Código:
class FirstRecycleViewExample : AppCompatActivity() {
val data = arrayListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.first_recycleview)
val recycler_view = findViewById(R.id.recycler_view) as RecyclerView ///IN THIS LINE I AM GETTING THE ERROR
data.add("First Data")
data.add("Second Data")
data.add("Third Data")
data.add("Forth Data")
data.add("Fifth Data")
//creating our adapter
val adapter = CustomRecycleAdapter(data)
//now adding the adapter to recyclerview
recycler_view.adapter = adapter
}
}
android
android-layout
kotlin
type-inference
Ravindra Kushwaha
fuente
fuente
<>
cuando lo uso, está dando un error.Estás en el nivel de API 26, donde el tipo de retorno de
findViewById
ahora es genérico enT
lugar deView
y, por lo tanto, se puede inferir. Puede ver el registro de cambios relevante aquí .Entonces deberías poder hacer esto:
val recycler_view = findViewById<RecyclerView>(R.id.recycler_view)
O esto:
val recycler_view: RecyclerView = findViewById(R.id.recycler_view)
fuente
En
Kotlin
podemos obtener el id de la vista sin el uso de lafindViewById
sintaxis.Por ejemplo, estamos usando el siguiente diseño del que obtendremos la identificación de la vista y realizaremos la operación
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/welcomeMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="Hello World!"/> </FrameLayout>
Podemos encontrar la identificación de la vista usando el siguiente código
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) welcomeMessage.text = "Hello Kotlin!" ////WE ARE GETTING THE IDS WITHOUT USING THE FINDVIEWBYID syntax }
Para poder usarlo, necesita una importación especial (la que escribo a continuación), pero el IDE puede importarlo automáticamente. ¡No podría ser más fácil!
import kotlinx.android.synthetic.main.YOUR_LAYOUT_NAME.*/// HERE "YOUR_LAYOUT_NAME" IS YOUR LAYOUT NAME WHICH U HAVE INFLATED IN onCreate()/onCreateView()
Necesitamos importar esta propiedad para obtener la identificación de la vista sin el uso de la
findviewbyid
sintaxis.Para obtener más información sobre este tema, consulte este enlace: - Haga clic aquí
fuente
Por lo general, Kotlin puede inferir su tipo utilizando la información proporcionada entre paréntesis.
En este caso, no puede, por lo que tendría que especificarlo explícitamente así
Sin embargo, no estoy muy seguro del tipo, pero así es como debe especificarlo.
Me gustaría agregar que, usando Anko , puede simplificar aún más su código de esta manera:
val recycler_view : RecyclerView = find(R.id.recycler_view)
fuente
Agregue esta línea para su código como lo que esté usando controlador.
val tvHello = findViewById<TextView>(R.id.tvHello)
fuente
Puede ignorar dar identificadores a las variables en kotlin. Solo necesitas usar un complemento
Pega esto en tu gradle
apply plugin: 'kotlin-android-extensions'
y luego no necesita asignar identificadores a var, puede hacerlo como
fuente
Prueba esto:
Aquí la
bind
función genérica se usa para vincular la vista. su función general se puede utilizar para cualquier vista.class MyActivity : AppCompatActivity() { private lateinit var recycler_view : RecyclerView override fun onCreate(savedInstanceState: Bundle?) { ... recycler_view = bind(R.id.recycler_view) } } fun <T : View> Activity.bind(@IdRes res : Int) : T { @Suppress("UNCHECKED_CAST") return findViewById(res) as T }
fuente
Ni siquiera tiene que crear un objeto para hacer cosas con una vista. Puedes usar el id. Por ejemplo, Kotlin
es igual que, Java
fuente
No pude acceder a los componentes de la interfaz de usuario, ya que OP se ve como se necesitaba a continuación dentro de la aplicación gradle:
plugins { ... id 'kotlin-android-extensions' }
A pesar de que después de agregar esta línea, Android Studio aún no pudo resolver automáticamente las importaciones de sintéticos kotlin, por lo que es posible que deba invalidar el caché y reiniciar.
Si aún no funciona, importe manualmente según las vistas
Actualización - 2
Si recibe esta advertencia de información:
El complemento 'kotlin-android-extensions' quedará obsoleto. Así que agregue a continuación en su aplicación gradle
android { ... buildFeatures { viewBinding true } }
fuente