Инициализация RecyclerView с привязкой данных Android в Котлине вызывает ошибку. Что я делаю не так?

Описание

Я пытаюсь настроить экран Android в Kotlin с помощью RecyclerView с использованием привязки данных Android. У меня есть активность, которая содержит фрагмент, а фрагмент содержит RecyclerView, который я инициализирую с привязкой данных.

Проблема в том, что когда я пытаюсь настроить диспетчер макета списка ресайклеров, приложение выдает исключение IllegalStateException, жалуясь, что указанный дочерний элемент (я предполагаю, что это означает, что RecyclerView или LayoutManager) уже имеет родителя и что мне нужно запустить removeView ( ). Я попытался удалить все виды из RecyclerView, но безрезультатно.

Вот моя деятельность:

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() } } 

Вот мой фрагмент:

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

И вот мой макет фрагмента:

 <?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> 

Когда я пытаюсь запустить это, я получаю сообщение об ошибке в моем recyclerview, когда я пытаюсь установить LayoutManager:

java.lang.IllegalStateException: указанный ребенок уже имеет родителя. Сначала вы должны вызвать removeView () родителя ребенка.

Поэтому мой вопрос: что я делаю неправильно? Я неправильно использую привязку данных? Неужели Котлин просто плохо играет с привязкой данных? Любая помощь или отзывы будут оценены.

Редактировать:

Вот полная трассировка стека для ошибки:

06-14 21: 34: 44.876 3631-3631 / com.kinler.mtgutility E / AndroidRuntime: FATAL EXCEPTION: main Процесс: com.kinler.mtgutility, PID: 3631 java.lang.IllegalStateException: указанный ребенок уже имеет родителя. Сначала вы должны вызвать removeView () родителя ребенка. в android.view.ViewGroup.addViewInner (ViewGroup.java:4885) в android.view.ViewGroup.addView (ViewGroup.java:4716) в android.view.ViewGroup.addView (ViewGroup.java:4656) в android.support. v7.widget.RecyclerView $ 5.addView (RecyclerView.java:751) в файле android.support.v7.widget.ChildHelper.addView (ChildHelper.java:107) в файле android.support.v7.widget.RecyclerView $ LayoutManager.addViewInt (RecyclerView .java: 7995) на android.support.v7.widget.RecyclerView $ LayoutManager.addView (RecyclerView.java:7953) на android.support.v7.widget.RecyclerView $ LayoutManager.addView (RecyclerView.java:7941) на android. support.v7.widget.LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1552) в файле android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1498) в файле android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager. java: 591) в файле android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3691) в файле android.support.v7.widget.RecyclerView.dispatchLayout (R ecyclerView.java:3408) в файле android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:3960) в android.view.View.layout (View.java:19393) в android.view.ViewGroup.layout (ViewGroup .java: 6022) на android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) на android.widget.FrameLayout.onLayout (FrameLayout.java:261) на android.view.View.layout (View.java:19393) на android.view.ViewGroup.layout (ViewGroup.java:6022) на android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) на android.widget.FrameLayout.onLayout (FrameLayout.java:261) на android.view. View.layout (View.java:19393) в android.view.ViewGroup.layout (ViewGroup.java:6022) на android.widget.LinearLayout.setChildFrame (LinearLayout.java:1791) на android.widget.LinearLayout.layoutVertical (LinearLayout .java: 1635) на android.widget.LinearLayout.onLayout (LinearLayout.java:1544) на android.view.View.layout (View.java:19393) на android.view.ViewGroup.layout (ViewGroup.java:6022) на android.widget.FrameLayout.layoutChildren (Fr ameLayout.java:323) на android.widget.FrameLayout.onLayout (FrameLayout.java:261) на android.view.View.layout (View.java:19393) на android.view.ViewGroup.layout (ViewGroup.java:6022 ) в com.android.internal.widget.ActionBarOverlayLayout.onLayout (ActionBarOverlayLayout.java:493) в android.view.View.layout (View.java:19393) в android.view.ViewGroup.layout (ViewGroup.java:6022) на android.widget.FrameLayout.layoutChildren (FrameLayout.java:323) на android.widget.FrameLayout.onLayout (FrameLayout.java:261) на com.android.internal.policy.DecorView.onLayout (DecorView.java:736) на android.view.View.layout (View.java:19393) в android.view.ViewGroup.layout (ViewGroup.java:6022) в android.view.ViewRootImpl.performLayout (ViewRootImpl.java:2480) в android.view.ViewRootImpl .performTraversals (ViewRootImpl.java:2199) в android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1385) в android.view.ViewRootImpl $ TraversalRunnable.run (ViewRootImpl.java:6722) в android.view.Choreographer $ CallbackRecord. пробег (C хореограф.ява: 886) на android.view.Choreographer.doCallbacks (хореограф.java:698) на android.view.Choreographer.doFrame (хореограф.java:633) на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.ява : 872) на android.os.Handler.handleCallback (Handler.java:769) на android.os.Handler.dispatchMessage (Handler.java:98) на android.os.Looper.loop (Looper.java:164) на android .app.ActivityThread.main (ActivityThread.java:6540) в java.lang.reflect.Method.invoke (собственный метод) в com.android.internal.os.Zygote $ MethodAndArgsCaller.run (Zygote.java:240) at com .android.internal.os.ZygoteInit.main (ZygoteInit.java:767)

Изменить 2:

Я вчера немного обработал отладку журналами, и кажется, что мой recyclerView инициализируется правильно, адаптер работает, и он создаст один ViewHolder и привяжет его перед тем, как выбросить ошибку. Я до сих пор не знаю, где происходит точная ошибка, но я планирую добавить записи журнала в другие места в потоке приложения, чтобы выяснить, где эта проблема.

Редактировать 3:

Вот мой код адаптера:

 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 } 

И мой код View Holder:

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

Вы создаете держатель вида с помощью HomeCardViewHolder(binding.homeCardTitle, binding) . itemView параметр itemView должен быть корневым. Судя по имени, homeCardTitle может быть представлением в иерархии самого связывания. Таким образом, он уже имеет родителя и не может быть добавлен в представление recycler.

Поэтому вместо этого HomeCardViewHolder(binding.root, binding) экземпляр владельца с помощью HomeCardViewHolder(binding.root, binding) .

Или просто обеспечьте держателю вида только привязку.

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