Actuellement, j'utilise Composants d'architecture Android pour le développement des applications, tout fonctionne avec la bibliothèque de pagination. Maintenant, je souhaite supprimer recyclerview Item à l'aide de PagedListAdapter pour renseigner ce que nous avions besoin pour ajouter une source de données. Je veux supprimer un élément de la liste notifyItemRemoved () travaille à partir de PagedList J'obtiens cette exception:
Java.lang.UnsupportedOperationException
Java.util.AbstractList.remove(AbstractList.Java:638)
Étant donné que vous ne pouvez pas modifier directement les données que vous avez dans la variable PagedList
, car je crois qu'elles sont immuables, la clé de la suppression des éléments dans cette situation est de conserver un ensemble de données backing quelque part dans votre code, qui représente toutes les données que vous avez. ont reçu jusqu'à présent. Un ArrayList
a fonctionné pour moi.
Lorsque vous souhaitez supprimer un élément, supprimez-le de votre jeu de données de sauvegarde et appelez invalidate sur votre source de données. Cela déclenchera l'appel loadInitial()
, dans lequel vous pourrez transmettre votre jeu de données de sauvegarde à la fonction callback.onResult()
. Votre PagedListAdapter
utilisera le DiffUtil.ItemCallback
que vous avez fourni pour déterminer de manière intelligente qu'il y a eu une mise à jour de ses données et se mettra à jour en conséquence.
Ce tutoriel m'a aidé à comprendre le bon flux à utiliser pour supprimer correctement un élément lors de l'utilisation de la bibliothèque de pagination: https://medium.com/@FizzyInTheHall/implementing-swipe-to-delete-with-Android -architecture-composants-a95165b6c9bd
Le rapport associé au tutoriel peut être trouvé ici: https://gitlab.com/adrianhall/notes-app
Adapter.notifyItemRemoved(position);
appDatabase.userDao().deleteUser(user);
C'est un travail pour moi!
J'ai eu le même problème. Ma PagedList affiche les éléments que l’usine DataSource a récupérés du serveur. J'ai proposé deux solutions pour supprimer un élément de la liste.
pagedList.dataSource.invalidate()
. L’inconvénient de cette solution est que toute la liste est effacée, puis tous les éléments reçus du serveur. Pas exactement ce que je cherchais.En objet DAO
("SELECT * FROM YourModel")
fun getAll(): DataSource.Factory<Int, YourModel>
@Delete
fun delete(item: YourModel)
Pour mettre à jour la base de données en tant que liste de défilement utilisateur, j'ai implémenté BoundaryCallback. Il est appelé lorsqu'il n'y a plus d'éléments à afficher dans la base de données. Il peut être appelé à la fin de la même page. Je me suis donc assuré de ne pas exécuter la même demande plusieurs fois (la clé dans ma liste est le numéro de page).
class YourModelBoundaryCallback(private val repository: Repository) : PagedList.BoundaryCallback<YourModel>() {
private val requestArray = SparseArray<Disposable>()
private var nextPage = 1
private var lastPage = 1
override fun onZeroItemsLoaded() {
if (requestArray.get(1) == null) {
requestArray.put(1, repository.getFirstPage()
.subscribe({
lastPage = it.total / PAGE_SIZE + if (it.total % PAGE_SIZE == 0) 0 else 1
nextPage++
}))
}
}
override fun onItemAtEndLoaded(itemAtEnd: YourModel) {
if (nextPage > lastPage) {
return
}
if (requestArray.get(nextPage) == null) {
requestArray.put(nextPage, repository.getNextPage(nextPage)
.subscribe({
lastPage = it.total / PAGE_SIZE + if (it.total % PAGE_SIZE == 0) 0 else 1
nextPage++
}))
}
}
override fun onItemAtFrontLoaded(itemAtFront: YourModel) {
// ignored, since we only ever append to what's in the DB
}
}
Instance PagedList est devenue ce
private val pagedListConfig = PagedList.Config.Builder()
.setEnablePlaceholders(false)
.setPrefetchDistance(3)
.setPageSize(PAGE_SIZE)
.build()
val pagedList = LivePagedListBuilder(yourModelDao.getAll(), pagedListConfig)
.setBoundaryCallback(YourModelBoundaryCallback(repository))
.build()
Et enfin, pour retirer un élément de l’adaptateur, j’appelle simplement yourModelDao.remove(yourModel)