我想用 Hilt 将我的 viewModel 注入到 RecyclerView 中。它可以被注入,但当 recyclerView 被销毁时 viewModel 不会被销毁。用刀柄在 recyclerView 中注入 viewModel 的最佳方法是什么?
问问题
400 次
2 回答
1
最好的方法是创建单独的适配器和视图持有者类,然后您可以将视图模型注入该视图持有者类而不是适配器。要销毁视图模型,您应该通过观察父生命周期来手动完成。当父生命周期事件为 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()
。
于 2021-11-11T09:03:31.477 回答
0
视图模型不应该被注入到适配器中,正如我在评论中看到的那样,你能找到比这更好的方法,
假设你有一个有很多行的适配器,当用户点击它时,每一行都会执行一个网络称呼。
首先,创建一个interface
interface Click {
fun onClick(index: Int, item: Model)
}
在您的适配器内部,初始化它的一个实例,然后在您的onBindViewHolder
yourview.setOnClickListener {v-> interface.onClick()}
无论您正在使用它的地方(Activity/Fragment/...),不要忘记初始化界面。
这是一个比对每一行都使用 ViewModel 更好的解决方案,这可能会导致 SystemLeaks。
于 2021-02-23T10:51:05.677 回答