starship13
-
Modifié le 10 mai 2021 à 09:47
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 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