アプリのアーキテクチャコンポーネントのLiveDataとViewModelを使用しています。
ページ分割されたアイテムのリストがあり、ユーザーが下にスクロールするとさらにロードされます。クエリの結果は
MutableLiveData<List<SearchResult>>
初期ロードを行って変数を新しいリストに設定すると、バインディングアダプターでコールバックがトリガーされ、データがrecyclerviewにロードされます。
ただし、2番目のページを読み込んでリストに追加項目を追加すると、コールバックはトリガーされません。ただし、古いアイテムと新しいアイテムの両方を含む新しいリストでリストを置き換えると、コールバックがトリガーされます。
LiveDataオブジェクトが更新されたときだけでなく、バッキングリストが更新されたときにLiveDataにオブザーバーに通知させることは可能ですか?
これは機能しません(nullチェックを無視します):
val results = MutableLiveData<MutableList<SearchResult>>()
/* later */
results.value.addAll(newResults)
これは動作します:
val results = MutableLiveData<MutableList<SearchResult>>()
/* later */
val list = mutableListOf<SearchResult>()
list.addAll(results.value)
list.addAll(newResults)
results.value = list
拡張機能は少しいいと思います。
operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
val value = this.value ?: arrayListOf()
value.addAll(values)
this.value = value
}
使用法:
list += anotherList;
MutableLiveData に従って、オブザーバーをトリガーするにはpostValue
またはsetValue
を使用する必要があります。