NotifyDataSetChanged() ne fonctionne pas

Fermé
Flo - 11 mai 2020 à 13:59
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 - 21 mai 2020 à 09:24
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 :
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

BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
11 mai 2020 à 21:40
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
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.
0
Merci pour ton aide.

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 :

Glide.with(context).load(profil.getUrl).into(image);


Que dois-je mettre dans ma méthode
onClick()
?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909 > Flo
12 mai 2020 à 09:21
As-tu vérifié si ton url est bonne ?
0
Flo > BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024
12 mai 2020 à 09:36
Oui oui, il n'y a pas de problème de ce côté là.
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.
0
Mon code fonctionne bien, je peux changer les données des cartes qui ne sont pas "chargés". Si par exemple je fais ça :
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 ?
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
19 mai 2020 à 08:56
On est bien d'accord que ton Adapter utilise les données de profilListe que tu mets dans ton bout de code ?
Sinon, une autre "solution" serait de vider l'adapter et de le re-remplir
0
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
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...
0
BunoCS Messages postés 15495 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 octobre 2024 3 909
21 mai 2020 à 09:24
Je ne peux malheureusement rien faire pour toi, ne connaissant pas cette lib. As-tu essayé de contacter les développeurs ?
0