Android. Comment notifyDataSetChanged() la méthode et les ListViews travail?
J'essaie de comprendre le ListView
concept et comment il fonctionne et je suis en train de créer ma propre carte qui s'étend BaseAdapter
. Pour ArrayAdapter
par exemple, il y a le notifyDataSetChanged()
méthode qui doit être appelée une fois que vous avez mis à jour la liste de tableau qui contient toutes vos données, afin de rafraîchir le ListView
.
Mais je suis entrain de créer mon propre sous-classe de BaseAdapter
. Cette méthode n'est pas disponible pour moi, ou est-il? Comment puis-je mettre en œuvre cette méthode? En fait, ce n'est que la méthode de faire exactement, je vais peut-être comprendre.
Dans le cas de la ArrayAdapter
j'imagine qu'il ressemble à ce que la position de la ListView
est en train de s'afficher et il vérifie si c'est le même que dans le ArrayList
après qu'il a été mis à jour? Ou...
Il est dit que la méthode:
Informe le joint d'observateurs que les données sous-jacentes a été
changé et tout point de Vue reflétant l'ensemble de données doit actualiser lui-même.
Mais exactement comment ça actualiser lui-même?
Quelqu'un peut m'expliquer s'il vous plaît?
Vous devez vous connecter pour publier un commentaire.
J'ai pensé à elle. Je ne pouvais pas comprendre comment l'enfer de l'adaptateur commencé et comment se fait-il savoir où obtenir les données. Quand j'ai étendu la
BaseAdapter
classe, dans le constructeur de la classe que j'ai initialisé la liste des éléments que je voulais voir dans leListView
. Mais je ne pouvais pas comprendre comment ces valeurs doit être utilisé et à quel moment.Voici donc la chose !!! :
Dans le
BaseAdapter
il y a quelques méthodes qui doivent être remplacées. Parmi ceux-ci, il n'y agetCount()
.Lorsque le
ListView
est créé et autres joyeusetés, il appellegetCount()
. Si cela renvoie une valeur différente de 0 (je suis retourné à la taille de la liste de tableaux que j'ai déjà initialisé dans le constructeur), puis il appellegetView()
suffisamment de fois pour remplir l'écran avec des objets. Par exemple, j'ai initialisé leArrayList
avec 20 éléments. Parce qu'à 8 éléments initialement présents à l'écran,getView()
a été appelé 8 fois, chaque fois pour demander la position requise pour moi de revenir (plus précisément, il a voulu savoir comment la ligne devrait ressembler dans la liste sur ce poste, quelles sont les données nécessaires pour contenir). Si j'ai faites défiler la liste,getView()
est appelé encore et encore, jusqu'à j'ai frappé à la fin de la liste, dans mon cas, 20 points /lignes.Ce
notifyDataSetChanged()
n'est ... lorsqu'il est appelé, il attend à ce que les éléments sont affichés sur l'écran au moment de son appel (plus précisément la ligne d'index ) et les appelsgetView()
avec ces positions.c'est à dire si vous affichez les 8 premiers éléments de la liste (donc ce sont celles qui sont visibles sur l'écran) et que vous ajoutez un autre élément entre le 2e et le 3e élément dans la liste et que vous appelez
notifyDataSetChanged()
puisgetView()
est appelé 8 fois, avec des positions de départ de 0 et se terminant par 7, et parce que dans legetView()
méthode que vous êtes l'obtention de données de laArrayList
puis il retournera automatiquement le nouvel élément inséré dans la liste à côté de 7 des 8 dernières (7 et pas 8 puisque le dernier élément est allé d'une position vers le bas, de sorte qu'il n'est plus visible), et leListView
se redessine, ou que ce soit, avec ces éléments.Également, important de préciser, c'est que si vous avez mis en œuvre
getView()
correctement, vous finirez par le recyclage des éléments (objets) déjà affiché (au lieu d'en créer de nouveaux). Voir cette vidéo autour de 12:00 minutes pour voir la bonne façon de mettre en œuvregetView()
J'ai compris tout cela en plaçant des appels à
LogCat
dans chaque méthode et à la suite de ce qui se passait.Espère que cela aide quelqu'un qui vient tout juste de commencer à comprendre comment
ListView
s de travail.P. S. Cet exemple aussi m'a beaucoup aidé à comprendre.
this video
plus. Pourriez-vous s'il vous plaît offrir la mise à jour du lien hypertexte?getView
s pour la mesure.BaseAdapter
peut être "observé" par les autres classes. Lorsque vous appelez la méthode deListView
setAdapter()
il appelleregisterDataSetObserver
de l'adaptateur. Donc, adaptateur sait qui sont intéressés par de nouvelles données.Vous pouvez vérifier la source de
BaseAdapter
ici. Il est assez petit.notifyDataSetChanged
est disponible pour vous et vous avez l'impression de ne pas le remplacer (car il n'est pas de faire quelque chose de spécial, de sorte que vous pouvez réutiliser dans votre propre classe).Supposons que votre
ListView
affiche certaines des données stockées dans uneArrayList
.Après vous modifiez le contenu de la
ArrayList
, vous devez dire à la liste de la source de données a changé et il a besoin de redessiner lui-même pour afficher les nouvelles données.Donc, c'est là que
notifyDatasetChanged()
vient dans. Il raconte l'ListView
que les données ont été modifiées; et pour montrer les nouvelles données, laListView
doit être redessiné.notifyDatasetChanged()
est appelé, je force le contrôle ListView pour appeler lagetView()
méthode pour l'actuel éléments affichés à l'écran?Comme vous étendez
BaseAdapter
pour votre propre pour la création d'une sous-classe, vous obtiendreznotifyDataSetChanged()
méthode.