En interne, LiveData garde une trace de chaque changement sous la forme d'un numéro de version (un simple compteur stocké en tant qu'entier). L'appel à setValue() incrémente cette version et met à jour tous les observateurs avec les nouvelles données (uniquement si le numéro de version de l'observateur est inférieur à celui de LiveData).
Il semble que la seule façon de démarrer ce processus est d'appeler setValue() ou postValue(). L'effet secondaire est que si la structure de données sous-jacente de LiveData a changé (par exemple en ajoutant un élément à une Collection), rien ne sera fait pour communiquer cette modification aux observateurs.
Ainsi, vous devrez appeler setValue() après avoir ajouté un élément à votre liste. J'ai fourni ci-dessous deux façons dont vous pourriez aborder cela.
Option 1
Gardez la liste en dehors de LiveData et mettez à jour la référence à chaque fois que le contenu de la liste change.
private val mIssuePosts = ArrayList()
private val mIssuePostLiveData = MutableLiveData>()
fun addIssuePost(issuePost: IssuePost) {
mIssuePosts.add(issuePost)
mIssuePostLiveData.value = mIssuePosts
}
Option 2
Suivez la liste via LiveData et mettez à jour LiveData avec sa propre valeur chaque fois que le contenu de la liste change.
private val mIssuePostLiveData = MutableLiveData>()
init {
mIssuePostLiveData.value = ArrayList()
}
fun addIssuePost(issuePost: IssuePost) {
mIssuePostLiveData.value?.add(issuePost)
mIssuePostLiveData.value = mIssuePostLiveData.value
}
L'une ou l'autre de ces solutions devrait vous éviter d'avoir à créer une nouvelle liste à chaque fois que vous modifiez la liste actuelle simplement pour avertir les observateurs.
MISE À JOUR :
J'utilise des techniques similaires depuis un certain temps maintenant, comme Gnzlt l'a mentionné dans sa réponse, en utilisant une extension de fonction Kotlin pour attribuer le LiveData à lui-même afin de simplifier le code. C'est essentiellement l'Option 2 automatisée :) Je vous recommande de le faire.
3 votes
Cela fonctionne comme vous le dites. Vous pouvez créer une sous-classe de LiveData et la méthode "add" qui créerait une nouvelle liste à partir de l'ancienne liste et ajouterait un nouvel élément.
0 votes
@bongo Que veux-tu dire? Est-ce que cela fonctionne lorsque j'ajoute un élément à la liste?
0 votes
Je veux dire que cela fonctionne comme "Mais autant que je sache, l'événement se déclenche uniquement lorsque je remplace la vieille liste par une nouvelle".
0 votes
@bongo Oui, je peux le faire, mais c'est gaspillage. Y a-t-il un moyen dans Android SDK de le faire ?
0 votes
Si vous voulez utiliser la version rx stackoverflow.com/a/61258643/4718406