J'utilise LiveData et ViewModel à partir des composants d'architecture de mon application.
J'ai une liste d'éléments qui est paginée, je charge plus que l'utilisateur fait défiler. Le résultat de la requête est stocké dans un
MutableLiveData<List<SearchResult>>
Lorsque je fais le chargement initial et que je définis la variable sur une nouvelle liste, un rappel est déclenché sur l'adaptateur de liaison qui charge les données dans la vue recyclée.
Toutefois, lorsque je charge la 2ème page et que j'ajoute les éléments supplémentaires à la liste, le rappel n'est pas déclenché. Toutefois, si je remplace la liste par une nouvelle liste contenant à la fois l'ancien et le nouvel élément, le rappel est déclenché.
Est-il possible que LiveData notifie ses observateurs lorsque la liste de sauvegarde est mise à jour, et pas seulement lorsque l'objet LiveData est mis à jour?
Cela ne fonctionne pas (en ignorant les contrôles nuls):
val results = MutableLiveData<MutableList<SearchResult>>()
/* later */
results.value.addAll(newResults)
Cela marche:
val results = MutableLiveData<MutableList<SearchResult>>()
/* later */
val list = mutableListOf<SearchResult>()
list.addAll(results.value)
list.addAll(newResults)
results.value = list
Selon MutableLiveData , vous devez utiliser postValue
ou setValue
afin de déclencher les observateurs.
Je pense que l'extension est un peu plus agréable.
operator fun <T> MutableLiveData<ArrayList<T>>.plusAssign(values: List<T>) {
val value = this.value ?: arrayListOf()
value.addAll(values)
this.value = value
}
Usage:
list += anotherList;