web-dev-qa-db-fra.com

Comment supprimer/supprimer un élément PagedListAdapter

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)
7
Faris Jameel

É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

3
Tyler Bennett

Adapter.notifyItemRemoved(position); appDatabase.userDao().deleteUser(user); C'est un travail pour moi!

1
Beyond Chen

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.

  1. Recharger toute la liste . Effectuez un appel API pour supprimer un élément du serveur, puis appelez 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.
  2. Conserver les résultats dans la salle. Ensuite, PagedList obtiendra les éléments directement de Room et PagedListAdapter gérera lui-même la suppression/l'ajout d'éléments.

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) 

1
cleanOK