Recyclerview недопустимое состояние исключение с привязкой данных и viewModel - PullRequest
0 голосов
/ 29 апреля 2019

Я извлекаю список категорий из API и устанавливаю их в утилите.Код адаптера написан в классе viewModel и вызывается фрагментом, который вызывает API.Ниже приведены методы установки адаптеров.

fun getAdapter(
   listener: OtherVideoCategoriesRecyclerAdapter.OtherVideoCategoriesRecyclerAdapterListener,context: Context
): OtherVideoCategoriesRecyclerAdapter {
    if (categoriesRecyclerAdapter == null)
        categoriesRecyclerAdapter = OtherVideoCategoriesRecyclerAdapter(listener,context)

    return categoriesRecyclerAdapter as OtherVideoCategoriesRecyclerAdapter

}

fun setItems(categories: ArrayList<OtherCategoriesItem>) {
    categoriesList = categories
    categoriesRecyclerAdapter!!.setItems(categoriesList!!)

}

И вот как я вызываю эти методы из моего класса фрагмента.

otherVideoViewModel.setItems(it.first.data!!.otherCategories as ArrayList<OtherCategoriesItem>)

Установка метода адаптера

private fun setAdapter() {
        otherVideosCategoriesBinding.recyclerView.layoutManager = LinearLayoutManager(activity)
        otherVideosCategoriesBinding.recyclerView.itemAnimator = DefaultItemAnimator()
        adapter = otherVideoViewModel.getAdapter(adapterListener,activity!!)
        otherVideosCategoriesBinding.recyclerView.adapter = adapter
    }

И это класс адаптера.

class OtherVideoCategoriesRecyclerAdapter(private val listener: OtherVideoCategoriesRecyclerAdapterListener,val context: Context): RecyclerView.Adapter<OtherVideoCategoriesRecyclerAdapter.ViewHolder>() {

    var categories = ArrayList<OtherCategoriesItem>()

    interface OtherVideoCategoriesRecyclerAdapterListener {
        fun onItemClicked(position: Int)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OtherVideoCategoriesRecyclerAdapter.ViewHolder {
        val inflater=LayoutInflater.from(context)
        val binding = ItemOtherVideoCategoryBinding.inflate(inflater, parent, false)

        return OtherVideoCategoriesRecyclerAdapter.ViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return categories.size
    }

    override fun onBindViewHolder(holder: OtherVideoCategoriesRecyclerAdapter.ViewHolder, position: Int) {
        val item = categories[position]
        holder.bindViews(item)

    }

    class ViewHolder(private val binding: ItemOtherVideoCategoryBinding): RecyclerView.ViewHolder(binding.root) {
        fun bindViews(model: OtherCategoriesItem){
            binding.model=model
            binding.executePendingBindings()
        }

    }
    fun setItems(categoriesList: ArrayList<OtherCategoriesItem>) {
        categories = categoriesList
        notifyDataSetChanged()
    }
}

Когда я запускаю этот код, он падает со следующим исключением.

java.lang.IllegalStateException: представления ViewHolder не должны быть присоединеныкогда создан.Убедитесь, что вы не передаете 'true' параметру attachToRoot в LayoutInflater.inflate (..., boolean attachToRoot)

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

1 Ответ

0 голосов
/ 29 апреля 2019

Эй, просто немного изменив свой onCreateViewHolder. Попробуйте это:

 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): OtherVideoCategoriesRecyclerAdapter.ViewHolder {
    val inflater=LayoutInflater.from(context)
    val binding:ItemOtherVideoCategoryBinding = DataBindingUtil.inflate(inflater,R.layout.your_layout_name, parent, false)

    return OtherVideoCategoriesRecyclerAdapter.ViewHolder(binding)
}
...