Contrôleurs
Objectif de ce chapitre
L'objectif de ce chapitre va être de faire interragir les deux ImageButton avec la ListView du chapitre précédent (Interfaces),
l'un pour la remplir, l'autre pour la vider.
Remplir une ListView
On va chercher tout d'abord le moyen de remplir la ListView avec des éléments. En l'occurence, imaginons que l'on veuille
afficher des chaînes de caractères, et les numéroter. La ListView contiendra donc deux colonnes,
une contenant les numéros des éléments, l'autre les éléments (chaînes de caractères dans ce cas de figure).
Il n'est malheureusement pas possible de remplir directement une ListView, qui est un élément graphique, il faut partir d'une ArrayList de type_de_l_élément_souhaité
- ici String - et passer par un "adapter".
Nous sommes donc dans la classe de l'activité principale (pour moi testActivity), et nous allons tout d'abord créer notre ArrayList de String,
et un tableau de string pour remplir cette ArrayList:
// On crée une ArrayList de String List<String> listString = new ArrayList<String>(); // On crée un tableau de Strings, de sorte à pouvoir remplir // l'ArrayList de Strings private String[] tabdeStrings = new String[]{"elem 1","elem 2", "elem 3","elem 4","elem 5","elem 6","elem 7", "elem 8","elem 9","elem 10","elem 11","elem 12"}; |
// Fonction pour remplir l'ArrayList avec le tableau de Strings private void RemplirListe() { listString.clear(); for (int i=0; i<tabdeStrings.length; i++) { listString.add(tabdeStrings[i]); } } |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:weightSum="2" > <TextView android:id="@+id/numElement" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1.5" android:textColor="#fff" android:gravity="left"/> <TextView android:id="@+id/element" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.5" android:textColor="#fff" android:gravity="left" /> </LinearLayout> |
//Constructeur de l'activité public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //Création du lien avec le fichier main.xml setContentView(R.layout.main); //Création des liens avec le main.xml this.page_accueil = (RelativeLayout)findViewById(R.id.page_accueil); this.titre_page = (TextView)findViewById(R.id.titre_page); this.contenuDeLaPage = (ListView)findViewById(R.id.contenuDeLaPage); this.zoneDeBoutons = (LinearLayout)findViewById(R.id.zoneDeBoutons); this.remplir = (ImageButton)findViewById(R.id.remplir); this.effacer = (ImageButton)findViewById(R.id.effacer); // On remplit l'ArrayList RemplirListe(); // On crée un StringAdapter adapter /* * StringAdapter est une classe que l'on va créer * dans la suite du tuto. * L'adapter permet de transformer une * ArrayList<Tout_ce_qu'on_veux> en une ListView. */ StringAdapter adapter = new StringAdapter(getApplicationContext(), listString); // On dit à la ListView de se remplir via cet adapter contenuDeLaPage.setAdapter(adapter); /* * Si vos données changent, penser à utiliser * la fonction adapter.notifyDataSetChanged(); * qui aura pour effet de notifier le changement de données * et de recharger la liste automatiquement. */ adapter.notifyDataSetChanged(); } |
package test.adaptaters; import java.util.List; import test.activities.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class StringAdapter extends BaseAdapter { List<String> epreuve; LayoutInflater inflater; /** * Ici le constructeur de l'adapter * * @param le contexte et la liste de Strings */ public StringAdapter(Context context,List<String> epreuve) { inflater = LayoutInflater.from(context); this.epreuve = epreuve; } // Fonction générée de base lorsque vous créez un adapter // Retourne la taille de l'ArrayList public int getCount() { return epreuve.size(); } // Fonction générée de base lorsque vous créez un adapter // Retourne la position (ligne en cours) public Object getItem(int position) { return epreuve.get(position); } // Fonction générée de base lorsque vous créez un adapter // Retourne la position (ligne) d'un élément public long getItemId(int position) { return position; } /** * Classe dans laquelle vous déclarez les éléments * qui vont être présents sur une ligne; * (ici, éléments du fichier ligne_de_la_listview.xml) */ private class ViewHolder { TextView numElement; TextView element; } // Fonction générée de base lorsque vous créez un adapter // Elle va lier la List<String> à la vue (ListView) public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null) { holder = new ViewHolder(); // On lie les éléments au fichier ligne_de_la_listview.xml convertView = inflater.inflate(R.layout.ligne_de_la_listview, null); // On lie les deux TextView déclarés précédemment à ceux du xml holder.numElement = (TextView)convertView.findViewById(R.id.numElement); holder.element = (TextView)convertView.findViewById(R.id.element); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // On défini ici le texte que doit contenir chacun des TextView // Le premier affichera le numéro de l'élément (numéro de ligne) holder.numElement.setText("" + position); // Le second affichera l'élément holder.element.setText(epreuve.get(position)); return convertView; } } |