I. Introduction▲
Voici des captures d'écran de l'application :
|
|
|
Les technologies utilisées dans ce tutoriel sont :
- listView ;
- listActivity ;
- événement sur checkbox ;
- adaptateur.
II. Création de l'application▲
Pour cela nous allons commencer par créer une application :

III. Les vues▲
Commençons par les vues.
La première est le main.xml. Elle comprend la listView (la liste). Sachant que nous allons utiliser une ListActivity par la suite, l'identifiant de la listView sera @android:id/list. Ce qui permettra à l'activité de reconnaitre automatiquement la liste.
Voici le code de la vue qui est assez simple :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">
<ListView android:id="@android:id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</LinearLayout>
La deuxième vue, nommée list_detail.xml, correspond au contenu de chaque ligne de la liste. Dans notre exemple, nous avons en tout quatre champs texte (deux libellés et deux champs modifiables) et une checkbox. Les champs texte sont placés dans des tableaux afin de pouvoir les intégrer correctement avec la checkbox. Mais là, libre à vous de placer vos champs où vous voulez !
Pour la checkbox, nous définissons la fonction qui permettra de récupérer l'événement dans l'activité comme ceci android:onClick="MyHandler".
L'identifiant de la checkbox est check, celle du champ modifiable contenant le nom est nom et celui du prénom est prenom.
Pour une raison ergonomique, nous choisissons de colorer une partie du bloc. Cette partie est celle définie par l'identifiant blocCheck.
Voici le code :
<?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">
<!-- Tableau permettant d'afficher tout le contenu d'un bloc -->
<TableLayout android:id="@+id/blocCheck"
android:background="@color/blue"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:layout_marginTop="25px"
android:layout_marginBottom="25px">
<!-- La première ligne affiche deux libellés côte à côte (le nom et sa valeur) -->
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="4sp"
android:paddingBottom="4sp">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20sp"
android:layout_weight="1"
android:layout_gravity="center_vertical">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="@string/nom"
android:layout_gravity="left"
android:layout_marginRight="5sp" />
<TextView android:id="@+id/nom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_gravity="left" />
</LinearLayout>
</TableRow>
<!-- Cette ligne affiche les deux libellés du prénom et la checkbox -->
<TableRow android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="4sp"
android:baselineAligned="true">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="20sp"
android:layout_weight="1"
android:layout_gravity="center_vertical">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="@string/prenom"
android:layout_gravity="left"
android:layout_marginRight="5sp" />
<TextView android:id="@+id/prenom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_gravity="left" />
</LinearLayout>
<CheckBox android:layout_height="wrap_content"
android:id="@+id/check"
android:layout_width="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="10sp"
android:onClick="MyHandler"/>
</TableRow>
</TableLayout>
</LinearLayout>Les vues sont créées.
IV. Les paramètres▲
Comme vous avez pu le remarquer, nous utilisons des variables définies dans d'autres fichiers xml afin de pouvoir internationaliser notre application si nous le souhaitons. Ainsi, nous avons un fichier string.xml comportant les différents libellés utilisés comme ceci :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World, checkBoxListVue!</string>
<string name="app_name">CheckBox list</string>
<string name="nom">Nom : </string>
<string name="prenom">Prénom : </string>
</resources>De même, nous allons utiliser des couleurs. Donc afin de pouvoir les modifier facilement et aussi de pouvoir les utiliser convenablement nous créons un fichier color.xml comme ceci :
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="blue">#3050A0</color>
<color name="green">#006600</color>
</resources>V. L'activité▲
Écrivons maintenant l'activité.
Cette activité remplit ma liste et utilise un adaptateur redéfini par une classe écrite plus bas. Elle contient la fonction publique void MyHandler(View v) qui permet de récupérer l'événement du clic sur la checkbox (rappelez-vous, nous avons défini cette fonction dans la vue au niveau de la checkbox).
Voici le code commenté de l'activité :
package com.developpez.vue;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ListView;
public class checkBoxListVue extends ListActivity {
private ListView list;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Récupération automatique de la liste (l'id de cette liste est nommé obligatoirement @android:id/list afin d'être détecté)
list = getListView();
// Création de la ArrayList qui nous permettra de remplir la listView
ArrayList<HashMap<String, String>> listItem = new ArrayList<HashMap<String, String>>();
// On déclare la HashMap qui contiendra les informations pour un item
HashMap<String, String> map;
map = new HashMap<String, String>();
map.put("nom", "Mouse");
map.put("prenom", "Mickey");
listItem.add(map);
map = new HashMap<String, String>();
map.put("nom", "Bunny");
map.put("prenom", "Bugs");
listItem.add(map);
//Utilisation de notre adaptateur qui se chargera de placer les valeurs de notre liste automatiquement et d'affecter un tag à nos checkbox
MyListAdapter mSchedule = new MyListAdapter(this.getBaseContext(), listItem,
R.layout.list_detail, new String[] { "nom", "prenom" }, new int[] {
R.id.nom, R.id.prenom });
// On attribue à notre listView l'adaptateur que l'on vient de créer
list.setAdapter(mSchedule);
}
//Fonction appelée au clic d'une des checkbox
public void MyHandler(View v) {
CheckBox cb = (CheckBox) v;
//on récupère la position à l'aide du tag défini dans la classe MyListAdapter
int position = Integer.parseInt(cb.getTag().toString());
// On récupère l'élément sur lequel on va changer la couleur
View o = list.getChildAt(position).findViewById(
R.id.blocCheck);
//On change la couleur
if (cb.isChecked()) {
o.setBackgroundResource(R.color.green);
} else {
o.setBackgroundResource(R.color.blue);
}
}
}VI. L'adaptateur▲
Il ne reste plus qu'à définir la classe MyListAdaptater qui permettra surtout de définir un tag pour chaque checkbox. Ce tag correspond à la position du bloc (l'item) dans lequel est située la checkbox. Ceci est défini dans la fonction getView.
Voici le code commenté :
package com.developpez.vue;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.SimpleAdapter;
public class MyListAdapter extends SimpleAdapter
{
private LayoutInflater mInflater;
public MyListAdapter (Context context, List<? extends Map<String, ?>> data,
int resource, String[] from, int[] to)
{
super (context, data, resource, from, to);
mInflater = LayoutInflater.from (context);
}
@Override
public Object getItem (int position)
{
return super.getItem (position);
}
@Override
public View getView (int position, View convertView, ViewGroup parent)
{
//Ce test permet de ne pas reconstruire la vue si elle est déjà créée
if (convertView == null)
{
// On récupère les éléments de notre vue
convertView = mInflater.inflate (R.layout.list_detail, null);
// On récupère notre checkBox
CheckBox cb = (CheckBox) convertView.findViewById (R.id.check);
// On lui affecte un tag comportant la position de l'item afin de
// pouvoir le récupérer au clic de la checkbox
cb.setTag (position);
}
return super.getView (position, convertView, parent);
}
}VII. Conclusion▲
Et voilà, votre application est terminée ! Vous pouvez désormais créer des listes et contrôler les événements liés aux éléments situés à l'intérieur de celle-ci.
Merci d'avoir suivi ce tutoriel et à bientôt ;)
VIII. Remerciements▲
Je tiens à remercier Feanorin, Viish, Jpelaho pour les améliorations apportées à ce tutoriel et ClaudeLELOUP pour la relecture.




