新しいページングライブラリを使用するときに単一の要素を更新するための最良の方法はどれですか?
ネットワークを使用したページングPageKeyedSubredditDataSource
を使用したGoogleサンプルがあるとします。 RedditPost
の単一の要素を変更したいとします。そのため、リストに含まれているかどうかを確認し、含まれている場合は更新します。更新は、最初のページを呼び出すinvalidate()を呼び出すほど簡単ではありません(おそらくRedditPostは5ページ目にあります。すべての要素を更新するのではなく、1つだけを更新します)。
これはすべて ネットワークを使用したページング googleサンプルで機能することに注意してください。それでも、アイデアはそこにあります。
@Sarquellaはこの解決策を手伝ってくれました。このクラスをプロジェクトに追加します。基本的に、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
クラスに追加できます(依存性注入を使用していると仮定します)。基本的に、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)
}
})
}
_