RecyclerView changement de l'ensemble de données
Je veux implémenter la fonctionnalité de recherche pour mon RecyclerView. Sur texte a changé, je veux changer les données qui sont affichées avec ce widget. Peut-être que cette question a été posée avant ou est simple, mais je ne sais pas comment modifier les données qui doit être montré...
Mon RecyclerView est définie comme suit:
//1. get a reference to recyclerView
mRecyclerView = (RecyclerView)findViewById(R.id.recyclerView);
//2. set layoutManger
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//3. create an adapter
mAdapter = new ItemsAdapter(itemsData);
//4. set adapter
mRecyclerView.setAdapter(mAdapter);
Et les données que je vous montre est quelque chose comme:
ItemData itemsData[] = { new ItemData("Mary Richards"),
new ItemData("Tom Brown"),
new ItemData("Lucy London")
};
Donc quand je veux donner la carte d'un autre ensemble de données, un autre tableau (avec un élément par exemple), que dois-je faire?
- Si vous voulez donner un autre tableau, vous pouvez simplement créer un nouveau
ItemsAdapter
avec elle et l'appelersetAdapter
de nouveau.
Vous devez vous connecter pour publier un commentaire.
Si vous avez stable id de votre carte, vous pouvez obtenir d'assez bons résultats (animations) si vous créez un nouveau tableau contenant les éléments filtrés et appel
À l'aide de swapAdapter conseils RecyclerView qu'il peut ré-utilisation afficher les titulaires. (vs en setAdapter, il a de recycler tous les points de vue et re-créer, car il ne sait pas que la nouvelle carte a la même ViewHolder ensemble avec l'ancienne carte).
Une meilleure approche serait de trouver les éléments qui sont supprimés et l'appel
notifyItemRemoved(index)
. N'oubliez pas de fait supprimer l'élément. Cela vous permettra de RecyclerView exécuter prédictive des animations. En supposant que vous avez une Carte qui utilise en interne une liste de tableaux, la mise en œuvre devrait ressembler à ceci:Il serait encore mieux si vous pouvez lot
notifyItemRemoved
appels et de les utilisernotifyItemRangeRemoved
à la place. Il serait qqch comme: (pas testé)Vous avez besoin d'étendre ce code pour ajouter des éléments qui ont déjà filtré, mais maintenant doit être visible (par exemple, l'utilisateur supprime le filtre de requête), mais je pense que ce qu'on devrait donner l'idée de base.
Gardez à l'esprit que, chaque notifier élément d'appels affecte les uns après elle (c'est pourquoi je suis en parcourant la liste à partir de la fin de l'éviter). La traversée de fin permet également ArrayList de supprimer la performance de la méthode (moins les éléments à déplacer).
Par exemple, si vous étiez en parcourant la liste de début et de supprimer les deux premiers éléments.
Vous devez appeler
ou si vous envoi un par un
swapAdapter()
. Il fonctionne très bien, oui. Mais toute autre solution comme l'utilisation de la même carte, et de modifier la sauvegarde des éléments de la liste des œuvres tout aussi bon, aussi longtemps que vous appeleznotifyDataSetChanged()
.C'est ma réponse - merci à Ivan Skoric à partir de son site: http://blog.lovelyhq.com/creating-lists-with-recyclerview-in-android/
J'ai créé une méthode supplémentaire à l'intérieur de ma classe d'adaptateur:
Puis à chaque fois que vos modifications de données, il vous suffit d'appeler cette méthode en transmettant vos données et votre vue doit être modifié pour refléter cela.
Viens de re-initialiser votre carte:
ou si vous avez uniquement besoin de supprimer ajouter quelques éléments plutôt qu'un ensemble de la liste:
ou
Si vous voulez changer la totalité de l'Adaptateur dans le recycleur de vue. vous pouvez simplement définir par
recycler.setAdapter(myAdapter);
Il sera automatiquement supprimer l'ancienne carte de recycleur de vue et de le remplacer par un nouvel adaptateur.
Comme ygit répondu,
swapAdapter
est intéressant lorsque vous avez à changer l'ensemble du contenu.Mais, dans mon FlexibleAdapter, vous pouvez mettre à jour les éléments avec
updateDataSet
. Vous pouvez même configurer l'adaptateur pour appelernotifyDataSetChanged
ou d'avoir la synchronisation des animations (activé par défaut). Que, parce que notifyDataSetChanged tue toutes les animations, mais il est bon d'avoir de grandes listes.Jetez un oeil à la description, demoApp et des pages Wiki: https://github.com/davideas/FlexibleAdapter