我希望使用Hilt将我的viewModel注入RecyclerView中。
可以注入,但是当recyclerView被销毁时viewModel没有被销毁。
使用Hilt在RecyclerView中注入viewModel的最佳方法是什么?
最好的方法是创建单独的适配器和视图持有者类,然后您可以将viewModel注入到该视图持有者类中,而不是适配器中。 要销毁viewModel,您应该通过观察parentlifecycle手动执行它。当父生命周期事件为ON_DESTROY时,在适配器类的init块中执行类似于以下内容的操作。
parentLifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onParentDestroy() {
recyclerView?.run {
for (i in 0 until childCount) {
getChildAt(i)?.let {
(getChildViewHolder(it) as BaseItemViewHolder<*, *>)
.run {
onDestroy()
viewModel.onManualCleared()
}
}
}
}
}
}
这里的onManualCleared()
函数调用了onCleared()
函数。
interface Click {
fun onClick(index: Int, item: Model)
}
onBindViewHolder
中使用它。yourview.setOnClickListener {v-> interface.onClick()}
不要忘记在使用它的地方(Activity / Fragment / ...)初始化接口。
这比为每一行使用ViewModel的解决方案更好,因为后者可能会导致SystemLeaks。