Inicializar un RecyclerView con Android Data Binding en Kotlin está arrojando un error. ¿Qué estoy haciendo mal?

Descripción

Estoy intentando configurar una pantalla de Android en Kotlin con un RecyclerView utilizando el data binding de Android. Tengo una actividad que contiene un fragment y el fragment contiene un RecyclerView que inicializo con data binding.

El problema es que cuando bash configurar el administrador de layout de mi vista de reciclador, la aplicación arroja una IllegalStateException quejándose de que el hijo especificado (supongo que significa RecyclerView o LayoutManager) ya tiene un padre y que necesito ejecutar removeView ( ) He intentado eliminar todas las vistas de RecyclerView, pero fue en vano.

Aquí está mi actividad:

class HomeActivity : BaseActivity() { private lateinit var mBinding: ActivityHomeBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBinding = DataBindingUtil.setContentView(this, R.layout.activity_home) if(savedInstanceState != null){ return } val fragment = HomeFragment.newInstance() supportFragmentManager.beginTransaction().add(R.id.home_fragment_container, fragment).commit() } } 

Aquí está mi fragment:

 class HomeFragment : BaseFragment() { private lateinit var mBinding: FragmentHomeBinding private lateinit var mRecyclerView: RecyclerView override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val testList = listOf("TEST TITLE") mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) mRecyclerView = mBinding.homeRecyclerview mRecyclerView.adapter = HomeOptionsAdapter(testList, View.OnClickListener { Log.d("[onCreateView]:", "I've been clicked") }) mRecyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false) return mBinding.root } companion object { fun newInstance(): HomeFragment { val fragment = HomeFragment() return fragment } } } 

Y aquí está mi layout de fragment:

 <?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" tools:context="joseph.kinler.mtgutility.fragments.HomeFragment"> <android.support.v7.widget.RecyclerView android:id="@+id/home_recyclerview" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> </FrameLayout> </layout> 

Cuando bash ejecutar esto, aparece un error en mi vista de reciclador cuando bash configurar LayManager:

java.lang.IllegalStateException: el hijo especificado ya tiene un padre. Primero debe llamar a removeView () en el padre del niño.

Entonces mi pregunta es: ¿Qué estoy haciendo mal? ¿Estoy usando el data binding incorrectamente? ¿Kotlin no está jugando bien con el data binding? Cualquier ayuda o comentario sería apreciado.

Editar:

Aquí está el seguimiento completo de stack para el error:

06-14 21: 34: 44.876 3631-3631 / com.kinler.mtgutility E / AndroidRuntime: EXCEPCIÓN FATAL: process principal: com.kinler.mtgutility, PID: 3631 java.lang.IllegalStateException: el elemento secundario especificado ya tiene un elemento primario. Primero debe llamar a removeView () en el padre del niño. en android.view.ViewGroup.addViewInner (ViewGroup.java:4885) en android.view.ViewGroup.addView (ViewGroup.java:4716) en android.view.ViewGroup.addView (ViewGroup.java:4656) en android.support. v7.widget.RecyclerView $ 5.addView (RecyclerView.java:751) en android.support.v7.widget.ChildHelper.addView (ChildHelper.java:107) en android.support.v7.widget.RecyclerView $ LayoutManager.addViewInt (RecyclerView) .java: 7995) en android.support.v7.widget.RecyclerView $ LayoutManager.addView (RecyclerView.java:7953) en android.support.v7.widget.RecyclerView $ LayoutManager.addView (RecyclerView.java:7941) en android. support.v7.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1552) en android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1498) en android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager. java: 591) en android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3691) en android.support.v7.widget.RecyclerView.dispatchLayout (R ecyclerView.java:3408) en android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:3960) en android.view.View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup .java: 6022) en android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) en android.widget.FrameLayout.onLayout (FrameLayout.java:261) en android.view.View.View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup.java:6022) en android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) en android.widget.FrameLayout.onLayout (FrameLayout.java:261) en android.view. View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup.java:6022) en android.widget.LinearLayout.setChildFrame (LinearLayout.java:1791) en android.widget.LinearLayout.layoutVertical (LinearLayout .java: 1635) en android.widget.LinearLayout.onLayout (LinearLayout.java:1544) en android.view.View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup.java:6022) en android.widget.FrameLayout.layoutChildren (Fr ameLayout.java:323) en android.widget.FrameLayout.onLayout (FrameLayout.java:261) en android.view.View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup.java:6022 ) en com.android.internal.widget.ActionBarOverlayLayout.onLayout (ActionBarOverlayLayout.java:493) en android.view.View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup.java:6022) en android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) en android.widget.FrameLayout.onLayout (FrameLayout.java:261) en com.android.internal.policy.DecorView.onLayout (DecorView.java:736) en android.view.View.layout (View.java:19393) en android.view.ViewGroup.layout (ViewGroup.java:6022) en android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2480) en android.view.ViewRootImpl .performTraversals (ViewRootImpl.java:2199) en android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1385) en android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6722) en android.view.Coreographer $ CallbackRecord. correr (C horeographer.java:886) en android.view.Choreographer.doCallbacks (Choreographer.java:698) en android.view.Choreographer.doFrame (Choreographer.java:633) en android.view.Coreographer $ FrameDisplayEventReceiver.run (Choreographer.java : 872) en android.os.Handler.handleCallback (Handler.java:769) en android.os.Handler.dispatchMessage (Handler.java:98) en android.os.Looper.loop (Looper.java:164) en android .app.ActivityThread.main (ActivityThread.java:6540) en java.lang.reflect.Method.invoke (Método nativo) en com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) en com .android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

Editar 2:

Hice un poco más de debugging anoche con los loggings y parece que mi recyclerView se está inicializando correctamente, el adaptador se está ejecutando, y creará un ViewHolder y lo vinculará antes de lanzar un error. Todavía no estoy seguro de dónde se produce el error exacto, pero estoy planeando agregar declaraciones de logging a más lugares en el flujo de mi aplicación para descubrir dónde ocurre el problema.

Editar 3:

Aquí está mi código de adaptador:

 class HomeOptionsAdapter(val items:List<String>, val itemListener: View.OnClickListener): RecyclerView.Adapter<HomeCardViewHolder>() { private val TAG = HomeOptionsAdapter::class.java.simpleName override fun onBindViewHolder(viewHolder: HomeCardViewHolder, position: Int) = viewHolder.bind(items[position], itemListener) override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HomeCardViewHolder { Log.d(TAG, "[onCreateViewHolder]") val inflater = LayoutInflater.from(parent.context) val binding = HomeCardBinding.inflate(inflater, parent, false) return HomeCardViewHolder(binding.homeCardTitle, binding) } override fun getItemCount(): Int = items.size } 

Y mi código del titular de la vista:

 class HomeCardViewHolder constructor(itemView: View, binding: HomeCardBinding): RecyclerView.ViewHolder(itemView) { private val TAG = HomeCardViewHolder::class.java.simpleName private var mBinding: HomeCardBinding init { mBinding = binding } fun bind(title: String, listener: View.OnClickListener) { Log.d(TAG, "[bind]") mBinding.homeCardTitle.text = title Log.d(TAG, title) mBinding.homeCardTitle.setOnClickListener(listener) } } 

Está creando el titular de la vista con HomeCardViewHolder(binding.homeCardTitle, binding) . Sin itemView , se supone que el parámetro itemView es la vista raíz. A juzgar por el nombre, homeCardTitle podría ser una vista en la jerarquía del enlace mismo. Por lo tanto, ya tiene un padre y no se puede agregar a la vista de reciclador.

Por lo HomeCardViewHolder(binding.root, binding) instancia del titular de la vista con HomeCardViewHolder(binding.root, binding) .

O simplemente proporcione al titular de la vista solo el enlace.

 class HomeCardViewHolder constructor(val binding: HomeCardBinding): RecyclerView.ViewHolder(binding.root) { private val TAG = HomeCardViewHolder::class.java.simpleName fun bind(title: String, listener: View.OnClickListener) { Log.d(TAG, "[bind]") binding.homeCardTitle.text = title Log.d(TAG, title) binding.homeCardTitle.setOnClickListener(listener) } } 
  • Advertencia del comstackdor al usar la anotación @Value en el proyecto Kotlin
  • La aplicación se bloquea al girar la pantalla
  • Entendiendo los rasgos en Kotlin
  • Cómo convertir 2 matrices a un map
  • Nashorn, pase el object java a javascript para que sea JSON.stringified
  • Kotlin: ¿Cómo verificar si enum contiene una cadena dada sin interferir con las excepciones?
  • Conversión de código Python a Kotlin
  • retryWhen () no llama a lo que está dentro de Observable.just ()
  • Smart Cast para BootsrapButton es imposible porque endtrip es una propiedad mutable que ha cambiado en este momento
  • ¿Cuál es el `it` en el cuerpo de Kotlin lambda?
  • Firma de tipo para la function Kotlin con parameters pnetworkingeterminados