{"id":800,"date":"2018-01-15T17:56:34","date_gmt":"2018-01-15T16:56:34","guid":{"rendered":"http:\/\/chezdom.net\/etu\/?page_id=800"},"modified":"2018-01-15T19:05:29","modified_gmt":"2018-01-15T18:05:29","slug":"android-cours-activites-de-type-liste","status":"publish","type":"page","link":"https:\/\/chezdom.net\/etu\/android-cours-activites-de-type-liste\/","title":{"rendered":"Android Cours &#8211; Activit\u00e9s de type \u00ab\u00a0liste\u00a0\u00bb"},"content":{"rendered":"<h2>Principe<\/h2>\n<p>On souhaite cr\u00e9er une activit\u00e9 de type \u00ab\u00a0liste\u00a0\u00bb, afin d&rsquo;afficher le contenu d&rsquo;une liste. Le cas typique est d&rsquo;afficher des r\u00e9sultats retourn\u00e9s par une requ\u00eate sur la  base de donn\u00e9es. On peut aussi utiliser une liste pour cr\u00e9er un menu (type menu des pr\u00e9f\u00e9rences d&rsquo;Android).<\/p>\n<p>Le principe est que la mise en page des lignes de la liste sera elle-m\u00eame d\u00e9finie dans un fichier de layout sp\u00e9cifique. Il existe des layouts par d\u00e9faut (pour des cas simples, comme l&rsquo;affichage de cha\u00eenes de caract\u00e8res), mais on peut aussi d\u00e9finir soi-m\u00eame un fichier de layout, ce qui permet de r\u00e9ellement mettre en forme ses lignes.<\/p>\n<p>Pour ce faire on va cr\u00e9er une activit\u00e9 de type <code>ListActivity<\/code>, associ\u00e9e \u00e0 un layout contenant un container de type <code>ListView<\/code>. Dans la m\u00e9thode <code>onCreate<\/code> de l&rsquo;activit\u00e9 on va associer notre liste \u00e0 ce <code>ListView<\/code> par l&rsquo;interm\u00e9diaire d&rsquo;un adapteur, en indiquant \u00e0 l&rsquo;adapteur la r\u00e9f\u00e9rence du fichier de layout des ligne. Une classe adapteur permet d&rsquo;adapter une classe contenant des donn\u00e9es \u00e0 ce qui est attendu dans une autre classe qui doit utiliser ces donn\u00e9es.<\/p>\n<h2>Liste simple, avec l&rsquo;adapteur par d\u00e9faut<\/h2>\n<p>Si on dispose de la liste des donn\u00e9es affich\u00e9es sous la forme d&rsquo;un tableau de type <code>ArrayList&lt;T&gt;<\/code> on va simplement utiliser l&rsquo;adapteur <code>ArrayAdapter&lt;T&gt;<\/code>, auquel on donnera le layout de ligne par d\u00e9faut simple, identifi\u00e9 par <code>android.R.layout.simple_list_item_1<\/code>.<\/p>\n<pre class=\"brush: java; gutter: true\">\nListView listView=getListView();\nArrayAdapter&lt;String&gt; adapter=new ArrayAdapter&lt;String&gt;(this, android.R.layout.simple_list_item_1, maListe);\nlistView.setAdapter(adapter);\n<\/pre>\n<p>Ici (on est dans la m\u00e9thode <code>onCreate<\/code> de l&rsquo;activit\u00e9) :<\/p>\n<ul>\n<li>la m\u00e9thode <code>getListView()<\/code> r\u00e9cup\u00e8re une r\u00e9f\u00e9rence sur le container <code>ListView<\/code> qu&rsquo;on aura pris soin de placer dans le fichier de layout de l&rsquo;activit\u00e9. <\/li>\n<li>dans la seconde ligne on cr\u00e9e l&rsquo;adapteur avec la liste et la r\u00e9f\u00e9rence au fichier de layout de la ligne. On utilise un layout de ligne par d\u00e9faut.<\/li>\n<\/ul>\n<h3>TP<\/h3>\n<p>Cr\u00e9er une activit\u00e9 avec une liste en dur, de type <code>ArrayList&lt;String&gt;<\/code>, contenant quelques lignes. Afficher cette liste dans l&rsquo;activit\u00e9.<\/p>\n<h3>TP (solution)<\/h3>\n<p>Voici d&rsquo;abord le fichier de layout.<\/p>\n<pre class=\"brush: xml; gutter: true\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;LinearLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    xmlns:tools=&quot;http:\/\/schemas.android.com\/tools&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;match_parent&quot;\n    android:orientation=&quot;vertical&quot;\n    tools:context=&quot;net.chezdom.tps.prgnom2017listview.MainActivity&quot;&gt;\n\n    &lt;ListView\n        android:id=&quot;@android:id\/list&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;match_parent&quot; \/&gt;\n&lt;\/LinearLayout&gt;\n<\/pre>\n<p>et le code java l&rsquo;activit\u00e9.<\/p>\n<pre class=\"brush: java; gutter: true\">public class MainActivity extends ListActivity {\n\n    @Override\n    protected void onCreate(Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n\n        ArrayList&lt;String&gt; maListe=new ArrayList&lt;String&gt;();\n        maListe.add(&quot;AAAAA&quot;);\n        maListe.add(&quot;BBBBB&quot;);\n        maListe.add(&quot;CCCCC&quot;);\n        maListe.add(&quot;DDDDD&quot;);\n        maListe.add(&quot;EEEEE&quot;);\n\n        ListView listView=this.getListView();\n        ArrayAdapter&lt;String&gt; adapter=new ArrayAdapter&lt;String&gt;(this, android.R.layout.simple_list_item_1, maListe);\n        listView.setAdapter(adapter);\n\n\n    }\n}\n<\/pre>\n<h2>Liste composite, avec son adapteur<\/h2>\n<p>Cette fois-ci on souhaite afficher une liste dans laquelle on pourra afficher plusieurs informations, avec une mise en page particuli\u00e8re.<\/p>\n<p>On va alors cr\u00e9er un fichier de layout correspondant \u00e0 notre besoin.<br \/>\n<img decoding=\"async\" src=\"http:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2018\/01\/row-layout.xml_.png\" alt=\"Layout de ligne\" \/><\/p>\n<p>Sur cette copie d&rsquo;\u00e9cran on voit une ligne qui sera compos\u00e9e d&rsquo;un champs de texte affich\u00e9 en gros avec en dessous 2 champs de textes plus petit, l&rsquo;un \u00e0 gauche de l&rsquo;\u00e9cran, l&rsquo;autre, en Italique, \u00e0 droite.<\/p>\n<p>Ensuite un va cr\u00e9er un adapteur dans lequel on d\u00e9finira ce qui doit \u00eatre affich\u00e9 dans chacun des des champs, via la m\u00e9thode <code>getView(int position, @Nullable View convertView, @NonNull ViewGroup parent)<\/code>. <code>position<\/code> correspond \u00e0 l&rsquo;\u00e9l\u00e9ment de la liste. la fonction get View va cr\u00e9er une ligne de la liste en pla\u00e7ant les valeurs de cet \u00e9l\u00e9ment (<code>position<\/code>) de la liste dans le layout de liste. le syst\u00e8me appellera donc <code>getView<\/code> pour chacune des lignes.<\/p>\n<h3>TP<\/h3>\n<p>Reprendre la premi\u00e8re partie, remplacer la liste de cha\u00eenes de caract\u00e8res par une liste plus compliqu\u00e9e, ou chaque \u00e9l\u00e9ment contient plusieurs valeurs (au moins 3). On pourra par exemple cr\u00e9er une classe pour stocker ces objets. Cr\u00e9er ensuite l&rsquo;adapteur permettant de d&rsquo;afficher la liste sous la forme indiqu\u00e9e sur la copie d&rsquo;\u00e9cran montr\u00e9e plus haut.<\/p>\n<p><a href=\"http:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2018\/01\/copie-\u00e9cran-android-listview-exemple.png\">Voir une copie d&rsquo;\u00e9cran du r\u00e9sultat attendu<\/a><\/p>\n<h3>TP (solution)<\/h3>\n<p>On va cr\u00e9er une classe objet comprenant 3 cha\u00eenes de caract\u00e8res.<\/p>\n<pre class=\"brush: java; gutter: true\">public class MyObject {\n    private String str1, str2, str3;\n    private String Str2;\n    private String Str3;\n\n    public MyObject(String str1, String str2, String str3) {\n        this.str1 = str1;\n        this.str2 = str2;\n        this.str3 = str3;\n    }\n<\/pre>\n<p>On la compl\u00e8tera avec une m\u00e9thode <code>toString<\/code>et des methodes de type getters pour r\u00e9cup\u00e9rer chacune des 3 cha\u00eenes de caract\u00e8res :<\/p>\n<pre class=\"brush: java; gutter: true\">public class MyObject {\n    public String getStr1() {\n        return this.str1;\n    }\n<\/pre>\n<p>Voici le code du layout de ligne <code>my_list_row.xml<\/code> :<\/p>\n<pre class=\"brush: xml; gutter: true\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;\n&lt;LinearLayout xmlns:android=&quot;http:\/\/schemas.android.com\/apk\/res\/android&quot;\n    android:layout_width=&quot;match_parent&quot;\n    android:layout_height=&quot;wrap_content&quot;\n    android:orientation=&quot;vertical&quot;&gt;\n\n    &lt;TextView\n        android:id=&quot;@+id\/textView1&quot;\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:text=&quot;TextView&quot;\n        android:textSize=&quot;30sp&quot;\n        android:textStyle=&quot;bold&quot; \/&gt;\n\n    &lt;LinearLayout\n        android:layout_width=&quot;match_parent&quot;\n        android:layout_height=&quot;wrap_content&quot;\n        android:orientation=&quot;horizontal&quot;&gt;\n\n        &lt;TextView\n            android:id=&quot;@+id\/textView2&quot;\n            android:layout_width=&quot;wrap_content&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:layout_weight=&quot;1&quot;\n            android:text=&quot;TextView&quot; \/&gt;\n\n        &lt;TextView\n            android:id=&quot;@+id\/textView3&quot;\n            android:layout_width=&quot;wrap_content&quot;\n            android:layout_height=&quot;wrap_content&quot;\n            android:layout_weight=&quot;1&quot;\n            android:text=&quot;TextView&quot;\n            android:textAlignment=&quot;textEnd&quot;\n            android:textStyle=&quot;italic&quot; \/&gt;\n    &lt;\/LinearLayout&gt;\n&lt;\/LinearLayout&gt;\n<\/pre>\n<p>On cr\u00e9e ensuite l&rsquo;adapteur :<\/p>\n<pre class=\"brush: java; gutter: true\">public class MyAdapter extends ArrayAdapter&lt;MyObject&gt; {\n\n    public MyAdapter(@NonNull Context context, @NonNull List&lt;MyObject&gt; objects) {\n        super(context, R.layout.my_list_row, objects);\n    }\n\n    @NonNull\n    @Override\n    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {\n\n        LayoutInflater inflater=(LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\n        View myRowView = inflater.inflate(R.layout.my_list_row, parent, false);\n\n        TextView tv1=myRowView.findViewById(R.id.textView1);\n        TextView tv2=myRowView.findViewById(R.id.textView2);\n        TextView tv3=myRowView.findViewById(R.id.textView3);\n\n        tv1.setText(this.getItem(position).getStr1());\n        tv2.setText(this.getItem(position).getStr2());\n        tv3.setText(this.getItem(position).getStr3());\n\n        return myRowView;\n    }\n}\n<\/pre>\n<p>Ici l&rsquo;<code>inflater<\/code>va cr\u00e9er la vue correspondant \u00e0 une ligne particuli\u00e8re, on va ensuite r\u00e9cup\u00e9rer les r\u00e9f\u00e9rences aux diff\u00e9rents <code>textView<\/code> et leur assigner les valeurs en provenance de la classe <code>myObject<\/code>.<\/p>\n<p>Enfin il reste \u00e0 appeler cet adapteur dans le <code>onCreate<\/code> de l&rsquo;activit\u00e9 principale (<code>ListActivity<\/code>) :<\/p>\n<pre class=\"brush: java; gutter: true\">\nListView listView=this.getListView();\nMyAdapter adapter=new MyAdapter(this, maListe);\nlistView.setAdapter(adapter);\n<\/pre>\n<h2>Donn\u00e9es r\u00e9cup\u00e9r\u00e9es dans la base de donn\u00e9es<\/h2>\n<p>Dans ce cas, les donn\u00e9es sont r\u00e9cup\u00e9r\u00e9es dans la base gr\u00e2ce \u00e0 une requ\u00eate SQL (voir les \u00e9l\u00e9ments de cours <a href=\"http:\/\/chezdom.net\/etu\/wp-content\/uploads\/sites\/3\/2013\/11\/Android-DB.paper_.pdf\">Enregistrer des donn\u00e9es<\/a>)<\/p>\n<p>On commence par cr\u00e9er un fichier de layout pour la ligne.<\/p>\n<p>Comme on l&rsquo;a vu dans ce cours, la m\u00e9thode <code>query<\/code> renvoie un objet de type <code>Cursor<\/code>. Il reste \u00e0 faire un adapteur pour adapter un cursor \u00e0 notre layout de ligne.<\/p>\n<h3>TP<\/h3>\n<p>Reprendre le <a href=\"http:\/\/chezdom.net\/etu\/2017\/10\/30\/android-tp2-2017\/\">TP2<\/a> (enregistrement de donn\u00e9es), ajouter une activit\u00e9 pour afficher la liste des donn\u00e9es enregistr\u00e9es (voir le cours sur les <a href=\"http:\/\/chezdom.net\/etu\/android-courstp-4-intents\/\">Intents<\/a>. Cr\u00e9er maintenant un adapteur pour afficher les r\u00e9sultats de notre requ\u00eate dans la liste.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Principe On souhaite cr\u00e9er une activit\u00e9 de type \u00ab\u00a0liste\u00a0\u00bb, afin d&rsquo;afficher le contenu d&rsquo;une liste. Le cas typique est d&rsquo;afficher des r\u00e9sultats retourn\u00e9s par une requ\u00eate sur la base de donn\u00e9es. On peut aussi utiliser une liste pour cr\u00e9er un<span class=\"ellipsis\">&hellip;<\/span> <span class=\"read-more\"><a href=\"https:\/\/chezdom.net\/etu\/android-cours-activites-de-type-liste\/\">Lire la suite &#8250;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"class_list":["post-800","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/P9qu1A-cU","_links":{"self":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/comments?post=800"}],"version-history":[{"count":15,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/800\/revisions"}],"predecessor-version":[{"id":820,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/800\/revisions\/820"}],"wp:attachment":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/media?parent=800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}