内部的に、LiveDataは各変更をバージョン番号(単純なカウンタをintとして格納)として記録します。 setValue()を呼び出すと、このバージョンがインクリメントされ、オブザーバのバージョン番号がLiveDataのバージョンより小さい場合のみ、オブザーバが新しいデータで更新されます。
このプロセスを開始する唯一の方法は、setValue()またはpostValue()を呼び出すことです。副作用は、LiveDataの基礎となるデータ構造が変更された場合(Collectionに要素を追加するなど)、これをオブザーバに伝えることは何も起こりません。
したがって、リストに項目を追加した後にsetValue()を呼び出す必要があります。私はあなたがこれに近づける2つの方法を提供しました。私は最初の選択肢がより好きです。
オプション1
リストの内容が変更いつでもLiveDataの外部リストを保持し、参照して更新します。
private val mIssuePosts = ArrayList<IssuePost>()
private val mIssuePostLiveData = MutableLiveData<List<IssuePost>>()
fun addIssuePost(issuePost: IssuePost) {
mIssuePosts.add(issuePost)
mIssuePostLiveData.value = mIssuePosts
}
オプション2
LiveDataを経由して、リストを追跡すると、リストの内容が変更するたびに、独自の値でLiveDataを更新します。
private val mIssuePostLiveData = MutableLiveData<List<IssuePost>>()
init {
mIssuePostLiveData.value = ArrayList()
}
fun addIssuePost(issuePost: IssuePost) {
mIssuePostLiveData.value?.add(issuePost)
mIssuePostLiveData.value = mIssuePostLiveData.value
}
これらのいずれの方法も、現在のリストを変更してオブザーバーに通知するたびに新しいリストを作成する必要はありません。
あなたが言うように、それは驚きです。 LiveDataのサブクラスを作成し、古いリストから新しいリストを作成し、新しい要素を追加するメソッドaddを追加することができます。 – bongo
@bongoどういう意味ですか?リストに項目を追加すると機能しますか? – LeShChEnKoUa
私はそれが "私が以前のリストを新しいものに置き換えたときだけイベントが受け取ると理解しているように"と働いています。 – bongo