NotifyDataSetChanged() ne fonctionne pas
Flo
-
BunoCS Messages postés 15952 Date d'inscription Statut Modérateur Dernière intervention -
BunoCS Messages postés 15952 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour à tous,
Depuis quelques jours je bute sur un problème... Dans mon application sur Android, l'utilisateur peut "Swiper" des cartes avec le profil des autres utilisateurs à l'intérieur. Cependant, dans les profils, les utilisateurs ont plusieurs photos ou images. Ce que je souhaiterai, c'est que par le biais d'un clic sur une flèche (en dehors de la carte) l'image change.
Voici un résumé de mon code :
MainActivity.java :
CartesImagesAdapter.java :
J'ai lu sur divers forums que notifyDataSetChanged() ne fonctionne que si on utilise les fonctions add, insert, remove et clear. Est-ce pour cela que l'image ne change pas ?
J'espère avoir été clair dans mes explications, n'hésitez pas si il y a des questions.
Merci d'avance.
Depuis quelques jours je bute sur un problème... Dans mon application sur Android, l'utilisateur peut "Swiper" des cartes avec le profil des autres utilisateurs à l'intérieur. Cependant, dans les profils, les utilisateurs ont plusieurs photos ou images. Ce que je souhaiterai, c'est que par le biais d'un clic sur une flèche (en dehors de la carte) l'image change.
Voici un résumé de mon code :
MainActivity.java :
public class MainActivity extends AppCompatActivity { SwipeStack mSwipeStack; ImageButton ivFleche; CartesImagesAdapter cartesImagesAdapter; ArrayList<CartesImagesObjet> profilListe; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ivFleche = findViewById(R.id.ivFleche); ivFleche.setOnClickListener(ivFlecheListener); mSwipeStack = findViewById(R.id.swipeCardsView); profilListe = new ArrayList<CartesImagesObjet>(); cartesImagesAdapter = new CartesImagesAdapter(profilListe, this); mSwipeStack.setAdapter(cartesImagesAdapter); CreationProfil(); } Public void creationProfil(){ CartesImagesObjet profil1 = new CartesImagesObjet(idProfil1, url1Profil1); CartesImagesObjet profil2 = new CartesImagesObjet(idProfil2, url1Profil2); CartesImagesObjet profil3 = new CartesImagesObjet(idProfil3, url1Profil3); CartesImagesObjet profil4 = new CartesImagesObjet(idProfil4, url1Profil4); CartesImagesObjet profil5 = new CartesImagesObjet(idProfil5, url1Profil5); profilListe.add(profil1); profilListe.add(profil2); profilListe.add(profil3); profilListe.add(profil4); profilListe.add(profil5); cartesImagesAdapter.notifyDataSetChanged(); } //Lorsque l'on clique sur la flèche private View.OnClickListener ivFlecheListener = new View.OnClickListener() { @Override public void onClick(View v) { CartesImagesObjet profil = profilListe.get(0); CartesImagesObjet profilActualise = new CartesImagesObjet(profil.getIdProfil(), url2Profil; profilListe.set(0, profilActualise); cartesImagesAdapter.notifyDataSetChanged(); } }; }
CartesImagesAdapter.java :
public class CartesImagesAdapter extends BaseAdapter { private List<CartesImagesObjet> profilListe; private Context context; public CartesImagesAdapter(List<CartesImagesObjet> profilListe, Context context){ this.profilListe = profilListe; this.context = context; } @Override public int getCount() { return profilListe.size(); } @Override public Object getItem(int position) { return profilListe.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { convertView = LayoutInflater.from(context).inflate(R.layout.item_cartes_images, parent, false); ImageView image = convertView.findViewById(R.id.ivImages); CartesImagesObjet profil = profilListe.get(position); Glide.with(context).load(profil.getUrl).into(image); return convertView; } }
J'ai lu sur divers forums que notifyDataSetChanged() ne fonctionne que si on utilise les fonctions add, insert, remove et clear. Est-ce pour cela que l'image ne change pas ?
J'espère avoir été clair dans mes explications, n'hésitez pas si il y a des questions.
Merci d'avance.
3 réponses
Hello,
Erreur classique : tu as 2 listes d'objets (qui porte en plus le même nom), une dans l'Activity, une dans l'Adapter.
Dans ta méthode
Pour résoudre ton souci, il te faut utiliser une seule liste.
Erreur classique : tu as 2 listes d'objets (qui porte en plus le même nom), une dans l'Activity, une dans l'Adapter.
Dans ta méthode
onClick(), tu modifies la liste de l'Activity. Or, lorsque tu appelles le
notifyDataSetChanged(), tu ré-affiches la liste de l'Adapter, qui n'a pas changé.
Pour résoudre ton souci, il te faut utiliser une seule liste.
Mon code fonctionne bien, je peux changer les données des cartes qui ne sont pas "chargés". Si par exemple je fais ça :
et ensuite je swipe les premières cartes, alors le profil à la 4ème position à bien été modifié.
Mais pour la première carte qui est déjà affichée à mon écran, impossible de modifier les données instantanément.
Quelqu'un aurait une idée ?
profilListe.set(3, profilActualise); cartesImagesAdapter.notifyDataSetChanged()
et ensuite je swipe les premières cartes, alors le profil à la 4ème position à bien été modifié.
Mais pour la première carte qui est déjà affichée à mon écran, impossible de modifier les données instantanément.
Quelqu'un aurait une idée ?
Quand j'utilise une listView à la place de SwipeStack, toutes les solutions que j'ai essayé précédemment pour changer les données du profil fonctionnent. La fonction
J'ai aussi essayé de créer un nouvel adapter dans la méthode
Aucun succès. Le profil qui est en cours d'affichage ne se modifie pas. Alors que dans une listView ça fonctionne...
Il doit sûrement avoir une fonction dans SwipeStrack qui permet de rafraîchir la carte mais je ne trouve pas...
notifyDataSetChanged()fonctionne comme il le faut.
J'ai aussi essayé de créer un nouvel adapter dans la méthode
onClick():
cartesImagesAdapter2 = new CartesImagesAdapter(nouveauProfilListe, MainActivity.this); mSwipeStack.setAdapter(cartesImagesAdapter2);
Aucun succès. Le profil qui est en cours d'affichage ne se modifie pas. Alors que dans une listView ça fonctionne...
Il doit sûrement avoir une fonction dans SwipeStrack qui permet de rafraîchir la carte mais je ne trouve pas...
Oui je vois ce que tu me dis, mais après plusieurs essais je ne parviens pas à changer l'URL dans mon ImageView de mon adapter :
Que dois-je mettre dans ma méthode ?
Après avoir fait quelques manipulations, j'ai l'impression que je parviens à changer l'image des cartes suivante, mais pas celle qui s'affiche en premier. Celle-ci impossible de modifier les données et "d'actualiser" la carte.