2017-12-22 34 views
0

LiveDataのリストにアイテムが追加されたときにObserverイベントを取得する必要があります。しかし、私が理解しているように、古いリストを新しいものに置き換えたときだけ、イベントは受け取る。 たとえば、次のとき:LiveDataのリストにアイテムが追加されたときにObserverに通知する

list.value = mutableListOf(IssuePost(UserEntity(name, email, photoUrl), issueEntity)) 

オブザーバーがイベントを取得します。しかし、私が価値あるものにアイテムを追加するだけでは、Observerは黙っています。 私は必要なものをどのように実装できるのかアドバイスしてください。

+0

あなたが言うように、それは驚きです。 LiveDataのサブクラスを作成し、古いリストから新しいリストを作成し、新しい要素を追加するメソッドaddを追加することができます。 – bongo

+0

@bongoどういう意味ですか?リストに項目を追加すると機能しますか? – LeShChEnKoUa

+0

私はそれが "私が以前のリストを新しいものに置き換えたときだけイベントが受け取ると理解しているように"と働いています。 – bongo

答えて

1

内部的に、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 
} 

これらのいずれの方法も、現在のリストを変更してオブザーバーに通知するたびに新しいリストを作成する必要はありません。

関連する問題