3

我想用 Hilt 将我的 viewModel 注入到 RecyclerView 中。它可以被注入,但当 recyclerView 被销毁时 viewModel 不会被销毁。用刀柄在 recyclerView 中注入 viewModel 的最佳方法是什么?

4

2 回答 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 回答