Лучший способ обновить отдельный элемент с помощью Paging Library - PullRequest
0 голосов
/ 31 мая 2018

Какой наилучший способ обновить отдельный элемент при использовании новой библиотеки подкачки?

Допустим, у нас есть образец поискового вызова с сетью google, использующий PageKeyedSubredditDataSource.Представьте, что мы хотим внести изменения в один элемент RedditPost.Итак, мы хотим проверить, есть ли он в списке, и если да, обновить его.Обновление не должно быть таким простым, как вызов invalidate (), который вызовет первую страницу (возможно, RedditPost находится на 5-й странице. Мы не хотим обновлять все элементы, только один).

1 Ответ

0 голосов
/ 27 сентября 2018

Обратите внимание, что все это работает через Пейджинг с сетью образец 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)
        }
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...