首页 > 解决方案 > 在 RecyclerView 中未调用 ViewModel onCleared

问题描述

我有一个带有下面代码的适配器。问题是,ViewModel 的 onCleared() 方法似乎永远不会为列表项的 ViewModel 调用。是否需要设置特殊方法/标志来清除这些 ViewModel?

class BaseRecyclerViewViewModelAdapter(
        private val lifecycleOwner: LifecycleOwner
) : RecyclerView.Adapter<BaseRecyclerViewViewModelViewHolder>() {

    var items: List<BaseRecyclerViewItemViewModel> = emptyList()
        set(value) {
            field = value
            notifyDataSetChanged()
        }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewViewModelViewHolder {
        val binding: ViewDataBinding =
                DataBindingUtil.inflate(LayoutInflater.from(parent.context), viewType, parent, false)
        return BaseRecyclerViewViewModelViewHolder(binding)
    }

    override fun getItemCount() = items.size

    override fun onBindViewHolder(holder: BaseRecyclerViewViewModelViewHolder, position: Int) {
        with(holder.binding) {
            setVariable(BR.viewModel, items[position])
            setLifecycleOwner(lifecycleOwner)
            executePendingBindings()
        }
    }

    override fun getItemViewType(position: Int) = items[position].layoutId
}

标签: androiddata-bindingkotlinandroid-databinding

解决方案


而且不会。根据官方文档

所有者活动完成后,框架调用 ViewModel 对象的 onCleared() 方法,以便它可以清理资源。

如果您想要clear列表中的某些内容 - 您应该手动完成。


推荐阅读