web-dev-qa-db-ja.com

アイテムのリストのMutableLiveDataの更新

アプリのアーキテクチャコンポーネントの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
12
Francesc

拡張機能は少しいいと思います。

operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
    val value = this.value ?: arrayListOf()
    value.addAll(values)
    this.value = value
}

使用法:

list += anotherList;
9
Samnang CHEA

MutableLiveData に従って、オブザーバーをトリガーするにはpostValueまたはsetValueを使用する必要があります。

5
Shynline