Обратите внимание, что все это работает через Пейджинг с сетью образец Google.Хотя это и есть идея.
@ Саркелла помогла мне с этим решением.Добавьте эти классы в ваш проект.По сути, мы расширяем ViewHolder
до LifeCycle Owner
, как это уже сделано по умолчанию с Activities
и Fragments
.
LifecycleViewHolder
:
abstract class LifecycleViewHolder(itemView: View) :
RecyclerView.ViewHolder(itemView),
LifecycleOwner {
private val lifecycleRegistry = LifecycleRegistry(this)
fun onAttached() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
fun onDetached() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
}
override fun getLifecycle(): Lifecycle = lifecycleRegistry
}
LifecycleOwner
- это интерфейс с одним методом, который обозначает, что класс имеет Lifecycle
.Вы можете найти дополнительную информацию здесь .
LifecyclePagedListAdapter
:
abstract class LifecyclePagedListAdapter<T, VH : LifecycleViewHolder>(diffCallback: DiffUtil.ItemCallback<T>) :
PagedListAdapter<T, VH>(diffCallback) {
override fun onViewAttachedToWindow(holder: VH) {
super.onViewAttachedToWindow(holder)
holder.onAttached()
}
override fun onViewDetachedFromWindow(holder: VH) {
super.onViewDetachedFromWindow(holder)
holder.onDetached()
}
}
LifecycleAdapter
(в случае необходимости):
abstract class LifecycleAdapter<VH : LifecycleViewHolder> :
RecyclerView.Adapter<VH>() {
override fun onViewAttachedToWindow(holder: VH) {
super.onViewAttachedToWindow(holder)
holder.onAttached()
}
override fun onViewDetachedFromWindow(holder: VH) {
super.onViewDetachedFromWindow(holder)
holder.onDetached()
}
}
Затем увеличивается MyAdapter
до LifecyclePagedListAdapter<MyEntity, LifecycleViewHolder>(MY_COMPARATOR)
и MyViewHolder
до LifecycleViewHolder(view)
.Вы должны будете закончить свои уроки, основываясь на том, что мы изменили, соответственно.Теперь мы можем наблюдать объект liveData
в классе MyViewHolder
.Таким образом, мы можем добавить это к MyViewHolder
классу (при условии, что вы используете Dependency Injection).По сути, мы сделаем то же самое, что и для Fragments
или Activities
:
private lateinit var myViewModel: MyViewModel
init {
(itemView.context as? AppCompatActivity)?.let{
myViewModel = ViewModelProviders.of(it).get(MyViewModel::class.java)
}
}
Затем внутри метода bind()
:
fun bind(myCell: MyEntity?) {
myViewModel.myLiveData.observe(this, Observer {
// Buala!! Check if it is the cell you want to change and update it.
if (it != null && myCell != null && it.id == myCell.id) {
updateCell(it)
}
})
}