web-dev-qa-db-ja.com

ページングライブラリを使用して単一の要素を更新する最良の方法

新しいページングライブラリを使用するときに単一の要素を更新するための最良の方法はどれですか?

ネットワークを使用したページングPageKeyedSubredditDataSourceを使用したGoogleサンプルがあるとします。 RedditPostの単一の要素を変更したいとします。そのため、リストに含まれているかどうかを確認し、含まれている場合は更新します。更新は、最初のページを呼び出すinvalidate()を呼び出すほど簡単ではありません(おそらくRedditPostは5ページ目にあります。すべての要素を更新するのではなく、1つだけを更新します)。

8
Damia Fuentes

これはすべて ネットワークを使用したページング googleサンプルで機能することに注意してください。それでも、アイデアはそこにあります。

@Sarquellaはこの解決策を手伝ってくれました。このクラスをプロジェクトに追加します。基本的に、ViewHolderを_LifeCycle Owner_に拡張します。これは、デフォルトでActivitiesFragmentsですでに行われているためです。

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()
    }
}
_

次に、MyAdapterLifecyclePagedListAdapter<MyEntity, LifecycleViewHolder>(MY_COMPARATOR)に拡張し、MyViewHolderLifecycleViewHolder(view)に拡張します。それに応じて、変更内容に基づいてクラスを完了する必要があります。これで、liveDataクラスのMyViewHolderオブジェクトを観察できます。したがって、これをMyViewHolderクラスに追加できます(依存性注入を使用していると仮定します)。基本的に、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)
        }
    })
}
_
2
Damia Fuentes