Problème d'affichage de données dans listview

Fermé
starship13 - Modifié le 10 mai 2021 à 09:47
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 10 mai 2021 à 09:57
Bonjour,

Nous sommes en train de coder une application de co-voiturage qui est relié à une base de données.
Mais nous avons un problème car aucune donnée ne s'affiche dans notre listview et nous ne comprenons pas pourquoi.

Voici les deux classes dans lesquelles nous avons fait ça.

Merci d'avance et bonne journée !


Classe pour ajouter une annonce :

package com.example.sousletoitdematesla;

import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.Arrays;

public class AjouterAnnonce extends AppCompatActivity {
     Button BoutonPublierAnnonce;
     EditText Départ ;
     EditText Arrivée ;
     EditText Date ;
     EditText HeureDeDépart ;
     EditText HeureDArrivée ;
     EditText NbDePassagers ;

     String DépartInput;
     String ArrivéeInput;
     String DateInput;
     String HeureDeDépartInput;
     String HeureDArrivéeInput;
     String NbDePassagersInput;

    ArrayList<Annonce> listeannonces;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_ajouter_annonce);

        Départ = findViewById(R.id.Départ);
        Arrivée = findViewById(R.id.Arrivée);
        Date = findViewById(R.id.Date);
        HeureDeDépart = findViewById(R.id.HeureDeDépart);
        HeureDArrivée  = findViewById(R.id.HeureDArrivée);
        NbDePassagers = findViewById(R.id.NbDePassagers);

        Départ.addTextChangedListener(AnnonceTextWatcher);
        Arrivée.addTextChangedListener(AnnonceTextWatcher);
        Date.addTextChangedListener(AnnonceTextWatcher);
        HeureDeDépart.addTextChangedListener(AnnonceTextWatcher);
        HeureDArrivée.addTextChangedListener(AnnonceTextWatcher);
        NbDePassagers.addTextChangedListener(AnnonceTextWatcher);

        BoutonPublierAnnonce = (Button) findViewById(R.id.BoutonPublierAnnonce);
        BoutonPublierAnnonce.setEnabled(false);
        BoutonPublierAnnonce.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick (View v) {

                SharedPreferences prefsStockees = getSharedPreferences("mesPrefs", MODE_PRIVATE);
                Gson gson = new Gson(); // on crée un gestionnaire de format json
                // on extrait la liste referencée par le mot cle_listeEtudiants qu'on avait stocké dans les
                // préférences partagées
                String listeAnnoncesTxtJson = prefsStockees.getString("cle_listeAnnonces", "");
                // desormais dans listeEtudiantsTxtJson on a tous nos etudiants stockés dans un format json
                // on reconstruit un tableau d'objets de type étudiants grace à al liste au format json
                
                if (listeAnnoncesTxtJson.equals("")) {
                    listeannonces = new ArrayList<Annonce>();
                } else {
                    Annonce[] tableauEtudiantsTemporaire = gson.fromJson(listeAnnoncesTxtJson, Annonce[].class);
                    // reconstitution d'une arrayList a partir du tableau tableauEtudiantsTemporaire
                    listeannonces = new ArrayList<Annonce>(Arrays.asList(tableauEtudiantsTemporaire));
                }

                String depart = Départ.getText().toString();
                String arrivee = Arrivée.getText().toString();
                String date = Date.getText().toString();
                String heurededepart = HeureDeDépart.getText().toString();
                String heuredarrivee = HeureDArrivée.getText().toString();
                String nbdepassagers = NbDePassagers.getText().toString();

                Annonce annonceAjout = new Annonce(depart, arrivee, date, heurededepart, heuredarrivee, nbdepassagers);
                listeannonces.add(annonceAjout);

                /** enregistrement de la liste dans "SharedPreferences" */
                // on cree un éditeur de préferences, pour mettre à jour "mesPrefs" :
                SharedPreferences.Editor prefsEditor = prefsStockees.edit();
                // on transforme la liste d'étudiant en format json :
                String ListeEtudiantsEnJson = gson.toJson(listeannonces);
                // on envoie la liste (json) dans la clé cle_listeEtudiants de mesPrefs :
                prefsEditor.putString("cle_listeEtudiants", ListeEtudiantsEnJson);
                prefsEditor.commit(); // on enregistre les préférences

                //Toast.makeText(AjouterAnnonce.this, "vous avez ajouté votre annonce !", Toast.LENGTH_SHORT).show();
                finish(); // on ferme l'activite et on revient à l'activite precedente

                //Intent i = new Intent(AjouterAnnonce.this, ListeAnnonces.class);
                //startActivity(i);
            }
        });
    }

    private TextWatcher AnnonceTextWatcher = new TextWatcher(){
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            DépartInput = Départ.getText().toString().trim();
            ArrivéeInput = Arrivée.getText().toString().trim();
            DateInput = Date.getText().toString().trim();
            HeureDeDépartInput = HeureDeDépart.getText().toString().trim();
            HeureDArrivéeInput = HeureDArrivée.getText().toString().trim();
            NbDePassagersInput = NbDePassagers.getText().toString().trim();

            BoutonPublierAnnonce.setEnabled(!DépartInput.isEmpty() && !ArrivéeInput.isEmpty() && !DateInput.isEmpty() && !HeureDeDépartInput.isEmpty() && !HeureDArrivéeInput.isEmpty() && !NbDePassagersInput.isEmpty());
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };
}


Classe de la liste d'annonce :
package com.example.sousletoitdematesla;

import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.Arrays;

public class ListeAnnonces extends AppCompatActivity {

     Button BoutonAjouterAnnonce;
     ArrayList<Annonce> listeannonces;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_liste_annonces);


        SharedPreferences prefsStockees = getSharedPreferences("mesPrefs", MODE_PRIVATE);
        Gson gson = new Gson(); // on crée un gestionnaire de format json
        // on extrait la liste referencée par le mot cle_listeEtudiants qu'on avait stocké dans les
        // préférences partagées
        String listeAnnonceTxtJson = prefsStockees.getString("cle_listeAnnonces", "");
        // desormais dans listeEtudiantsTxtJson on a tous nos etudiants stockés dans un format json
        // on reconstruit un tableau d'objets de type étudiants grace à al liste au format json
        if (listeAnnonceTxtJson.equals("")) {
            listeannonces = new ArrayList<Annonce>();
        }
        else {
            Annonce[] tableauAnnoncesTemporaire = gson.fromJson(listeAnnonceTxtJson, Annonce[].class);
            // reconstitution d'une arrayList a partir du tableau tableauEtudiantsTemporaire
            listeannonces = new ArrayList<Annonce>(Arrays.asList(tableauAnnoncesTemporaire));
        }

        BaseAdapter customBaseAdapter = new BaseAdapter(){

            // Return list view item count.
            @Override
            // a la question "combien d'éléments as-tu ?" on va fournir comme réponse la taille de la listeEtudiants.
            public int getCount(){
                return listeannonces.size();
            }


            @Override
            public Object getItem(int i) {
                // getItem doit renvoyer l'item qui est associé à l'éléméent de liste d'indice i
                // on renvoie simplement le i^eme elemnt de listeEtudiant, car la listview doit etre
                // etre synchronisée avec listeEtudiants
                return listeannonces.get(i);
            }

            @Override
            public long getItemId(int i) {
                return i;
            }

            @Override
            public View getView(final int itemIndex, View itemView, ViewGroup viewGroup) {
                Toast.makeText(ListeAnnonces.this, "vous avez cliqué sur " , Toast.LENGTH_SHORT).show();

                /** C'est ici que ca devient difficile : on va construire un affichage pour chaque item


* on a la fonction getView qui indique comment on doit constuire l'affichage de l'item

* numero 'itemIndex', en construisant la vue 'itemView'. Avec l'info du premier paramètre, on va

* construire le second. On considere donc ici qu'on ne construit l'affichage que pour 1 item

**/
                if (itemView == null) {   // on va creer une case réponse (une ligne du listview ) avec un modele défini dans le fichier
                    // xml main_activity_base_adapter
                    itemView = LayoutInflater.from(ListeAnnonces.this).inflate(R.layout.cadre_item_de_liste, null);
                }

                // On récupere les 3 cases (image + zone identite + zone age de ce modele)
                // on va les remplir par la suite avec les valeurs à affcher pour cette ligne
                //ImageView imageView = (ImageView) itemView.findViewById(R.id.baseUserImage);
                //TextView txt_annonce_nomprenom  = (TextView) itemView.findViewById(R.id.txt_nom_prenom);
                TextView txt_annonce_date_heures  = (TextView) itemView.findViewById(R.id.txt_date_heures);
                TextView txt_annonce_nbpassagers  = (TextView) itemView.findViewById(R.id.txt_nbpassagers);
                TextView txt_annonce_depart_arrivee  = (TextView) itemView.findViewById(R.id.txt_depart_arrivee);

                // on alterne la couleur du fond
                int colorPos = itemIndex % 2;
                if (colorPos == 0) {
                    itemView.setBackgroundColor(Color.parseColor("#FFFFFF"));
                } else {
                    itemView.setBackgroundColor(Color.parseColor("#FFFFFF"));
                }

                // on lit les valeur des ressources par rapport à listeetudiants
                Annonce annonceAafficher = (Annonce) listeannonces.get(itemIndex);
                //imageView.setImageResource(R.mipmap.ic_launcher);
                //final String nom = etudiantAafficher.Nom;
                //final String prenom = etudiantAafficher.Prénom;
                final String date = annonceAafficher.Date;
                final String depart = annonceAafficher.Départ;
                final String arrivee = annonceAafficher.Arrivée;
                final String nbdepassagers = annonceAafficher.NbDePassagers;
                final String heurededepart = annonceAafficher.HeureDeDépart;
                final String heuredarrivee = annonceAafficher.HeureDArrivée;

                // on les insère dans les champs correspondants
                //txt_annonce_nomprenom.setText(prenom + " " + nom);
                txt_annonce_depart_arrivee.setText("De " + depart + " à " + arrivee);
                txt_annonce_date_heures.setText("Le"+ date + " de " + heurededepart + " à " + heuredarrivee);
                txt_annonce_nbpassagers.setText("Nombre de places : " + nbdepassagers);


                /** que se passe-t'il si on click sur l'item en entier (itemView)?


* on va simplement lancer l'activité Voiretudiant en lui passant un parametre :

* l'index de l'étudiant cliqué

* */
               /*itemView.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View view) {
                        // on affiche un petit message de type Toast, qui arrivera aussi sur l'autre activite
                        //Toast.makeText(ListeAnnonces.this, "vous avez cliqué sur " + prenom + " " + nom, Toast.LENGTH_SHORT).show();
                        // on crée la nouvelle activite
                        Intent intent = new Intent(ListeAnnonces.this, VoirAnnonce.class);
                        // on lui passe un parametre : indexEtudiantClique, qui sera l'index de l'item cliqué
                        intent.putExtra("indexAnnonceClique", itemIndex);
                        startActivity(intent); // lancement de l'activité
                    }
                });*/
                // on termine la méthode surchargée en renvoyant la view créée
                return itemView;
            }
        };

        // de retour dans la methode onCreate :  on récupere enfin la listView pour affichage
        ListView lv_Annonces  = (ListView)findViewById(R.id.Liste_View_Annonces);
        // on l'associe au customAdapter. et voila
        lv_Annonces.setAdapter(customBaseAdapter);


        BoutonAjouterAnnonce = (Button) findViewById(R.id.BoutonAjouterAnnonce);
        BoutonAjouterAnnonce.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                Intent i = new Intent(ListeAnnonces.this, AjouterAnnonce.class);
                //i.putExtra("key", value); Optimal parameter
                startActivity(i);
            }
        });
    }
}


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ICI

Merci d'y penser dans tes prochains messages.

1 réponse

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
10 mai 2021 à 09:57
Hello,

Il faut sortir le
CustomAdapter
de la classe
ListAnnonces
et il lui fournir les données

Sinon, quelques premières remarques.

Il faudrait éviter de coder "à la Française" ;) et utiliser par contre des noms de variables qui reflètent le type d'objets. Ainsi, par exemple :
EditText Départ ;
EditText Arrivée ;

deviendrait
EditText departureEditText;
EditText arrivalEditText;

Etc.

ListView
a été remplacée par
RecyclerView
qui est plus optimisée. Il serait donc pertinent de travailler avec.
0