Вставить viewModel с рукояткой
Я хочу внедрить свою модель просмотра в RecyclerView с помощью Hilt. Он может быть введен, но viewModel не уничтожается при уничтожении recyclerView. как лучше всего вставить viewModel внутри recyclerView с рукоятью?
2 ответа
Лучший способ сделать это — создать отдельные классы адаптера и держателя представления, а затем вы можете внедрить свою модель представления внутри этого класса держателя представления вместо адаптера. Чтобы уничтожить viewModel, вы должны сделать это вручную, наблюдая за родительским жизненным циклом. когда родительское событие жизненного цикла ON_DESTROY, сделайте что-то подобное в блоке инициализации класса адаптера.
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
interface Click {
fun onClick(index: Int, item: Model)
}
внутри вашего адаптера, инициализируйте его экземпляр, а затем используйте его в своем
onBindViewHolder
yourview.setOnClickListener {v-> interface.onClick()}
не забудьте инициализировать интерфейс, независимо от того, где вы его используете (Activity / Fragment / ...).
Это лучшее решение, чем использование ViewModel для каждой строки, что может привести к SystemLeaks.