Aller au contenu

Liste avec section : ajouter un listener


dream hope

Recommended Posts

Bonjour

J'ai créer un liste avec des section comme proposé ici (http://android-france.fr/2009/07/27/intercaler-des-entetes-dans-une-listview/), ça marche sans problème.

Mais dans les cellules de cette liste, j'affiche un EditText et j'aimerais pouvoir ajouter un listener dessus ; et la ça coince.

Voici mon onCreate :

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       CopsCaract copsCaract = new CopsCaract();
   ArrayList> listCaract = createListForAndroidAdaptater(copsCaract.caracteristiqueVector);

   CopsCompt copsCompt = new CopsCompt();
   copsCompt.setDefaultCompetence();
   ArrayList> listComp = createListForAndroidAdaptater(copsCompt.competenceVector);


       // creation de nom objet de type ListSeparer
       ListSeparer adapter = new ListSeparer(this); 

       SimpleAdapter caractAdaptater = new SimpleAdapter(this, listCaract, R.layout.edit_caract_cell,
                 new String[]     {ITEM_CARACT,                         ITEM_VALUE}, 
                 new int[]     {R.id.caract_name,     R.id.caract_value});
       adapter.addSection("Caractéristique", caractAdaptater);

       SimpleAdapter compAdaptater = new SimpleAdapter(this, listComp, R.layout.edit_caract_cell,
                 new String[]     {ITEM_CARACT,     ITEM_VALUE}, 
                 new int[]     {R.id.caract_name, R.id.caract_value});
       adapter.addSection("Compétences", compAdaptater);


       ListView list = new ListView(this);
       list.setAdapter(adapter);
       this.setContentView(list); 



       final EditText eText = (EditText) findViewById(R.id.caract_value);
       System.out.println("eText = " + eText);
       eText.setOnKeyListener(new MyKeyListener());
}

Ca plante sur la dernière ligne parce que eText est null...

Du coup, je sais pas comment lui ajouter un listener...

Merci de votre aide

PS : Si besoin, mon ListSeparer :

public class ListSeparer extends BaseAdapter {

   public final Map sections = new LinkedHashMap();
   public final ArrayAdapter headers;
   public final static int TYPE_SECTION_HEADER = 0;  

   /**
    * Constructor.
    * pour les entetes utilisation du fichier list_header.xml
    * @param context
    */
   public ListSeparer(Context context) {
              //
       headers = new ArrayAdapter(context, R.layout.list_header); 
   }


   /**
    * méthode pour ajouter dans le header le nom de ma catégorie et dans sections le nom et un objet adapter
    * @param section
    * @param adapter
    */
   public void addSection(String section, Adapter adapter) {  
       this.headers.add(section);  
       this.sections.put(section, adapter);
   }

   /**
    * Renvoi la position d'un clique
    */
   public Object getItem(int position) {
       for(Object section : this.sections.keySet()) {
           Adapter adapter = sections.get(section);
           int size = adapter.getCount() + 1;

           // récupération de la position dans la section
           if(position == 0) return section;
           if(position < size) return adapter.getItem(position - 1);

           // passe à la section suivant
           position -= size;
       }
       return null;
   }

   /**
    *  renvoi le nombre d'item
    */
   public int getCount() {
       //     total de l'ensemble des sections, plus une pour chaque tête de section
       int total = 0;
       for(Adapter adapter : this.sections.values())
           total += adapter.getCount() + 1;
       return total;
   }

   /**
    * 
    */
   public int getViewTypeCount() {
       int total = 1;
       for(Adapter adapter : this.sections.values())
           total += adapter.getViewTypeCount();
       return total;
   }

   /**
    * 
    */
   public int getItemViewType(int position) {
       int type = 1;
       for(Object section : this.sections.keySet()) {
           Adapter adapter = sections.get(section);
           int size = adapter.getCount() + 1;
           // Récupération de la position dans la section
           if(position == 0) return TYPE_SECTION_HEADER;
           if(position < size) return type + adapter.getItemViewType(position - 1);
           // passe a la section suivante moins un par l'entête
           position -= size;
           type += adapter.getViewTypeCount();
       }
       return -1;
   }  

   /**
    * 
    * @return
    */
   public boolean areAllItemsSelectable() {
       return false;
   }

   /**
    * 
    */
   public boolean isEnabled(int position) {
       return (getItemViewType(position) != TYPE_SECTION_HEADER);
   }

   /**
    * 
    */
   public View getView(int position, View convertView, ViewGroup parent) {
       int sectionnum = 0;
       for(Object section : this.sections.keySet()) {
           Adapter adapter = sections.get(section);
           int size = adapter.getCount() + 1;
           // Récupération de la position dans la section
           if(position == 0) return headers.getView(sectionnum, convertView, parent);
           if(position < size) return adapter.getView(position - 1, convertView, parent);
           // otherwise jump into next section
           position -= size;
           sectionnum++;
       }
       return null;
   }

   /**
    * 
    */
   public long getItemId(int position) {
       return position;
   }  
}

Lien vers le commentaire
Partager sur d’autres sites

En schématisant un peu, un adapter n'instancie la vue d'un élément qu'à la demande, au moment où il affiche la portion de la liste affichée à l'écran. C'est donc normal que, dans le onCreate, tu récupères la valeur null.

Il faudrait que tu passes par ta propre implémentation d'un Adapter, pour gérer cela.

Mais est-ce vraiment ton besoin ? Un adapter (et la ListView qui va avec) n'a d'intérêt que pour afficher une liste d'élément en général variable, et qu'on ne connait pas à la construction de l'appli. Est-ce bien ton cas ? Un Layout (Linear, Relative, ...) classique ne serait-il pas plus adapté à ton besoin ?

Lien vers le commentaire
Partager sur d’autres sites

Mais est-ce vraiment ton besoin ? Un adapter (et la ListView qui va avec) n'a d'intérêt que pour afficher une liste d'élément en général variable, et qu'on ne connait pas à la construction de l'appli. Est-ce bien ton cas ? Un Layout (Linear, Relative, ...) classique ne serait-il pas plus adapté à ton besoin ?

En effet, je connais ma liste au lancement de l'appli. Par contre, j'ai besoin d'une liste avec section...

Et les seuls moyens que j'ai trouvé passent tous par un Adapter...

J'ai trouver une autre méthode (tuto de Cyril Mottierhttp://android.cyrilmottier.com/?p=232), mais toujours avec un adapter.

Je vais voir si je peux pas le modifier pour ajouter mon listener.

Lien vers le commentaire
Partager sur d’autres sites

Si tu n'as pas de liste dynamique à gérer, alors ne te prends pas la tête avec une ListView et son Adapter. Ce sera plus simple avec une Activity classique.

Il te suffit de définir un layout, basé sur LinearLayout par ex., qui soit, grosso modo, la concaténation des différents petits bouts de layout que tu trouves dans le premier tutoriel que tu indiquais. Tu pourras alors, dans le onCreate, récupérer tes TextView et leur affecter un KeyListener.

Lien vers le commentaire
Partager sur d’autres sites

Tu fais statiquement ce que la ListView et son Adapter ferait dynamiquement, c'est à dire concaténer des bouts de layout pour construire une vue.

Tu te crées un fichier layout (ma_vue.xml) comme suit (exemple pour 2 sections d'un élément, je te laisse extrapoler pour une organisation différente) :

      xmlns:android="http://schemas.android.com/apk/res/android"  
     android:layout_width="fill_parent"  
     android:layout_height="wrap_content"  
     android:orientation="vertical">
 xmlns:android="http://schemas.android.com/apk/res/android"  
       android:layout_width="fill_parent"  
      android:layout_height="wrap_content"  
      android:paddingTop="2dip"  
       android:paddingBottom="2dip"  
      android:paddingLeft="5dip"  
      android:text="@string/section1_title"
     style="?android:attr/listSeparatorTextViewStyle" />
      xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/item1_textview"  
    android:layout_width="fill_parent"  
     android:layout_height="fill_parent"  
     android:paddingTop="10dip"  
      android:paddingBottom="10dip"  
     android:paddingLeft="15dip"  
     android:textAppearance="?android:attr/textAppearanceLarge"  
  />
 xmlns:android="http://schemas.android.com/apk/res/android"  
       android:layout_width="fill_parent"  
      android:layout_height="wrap_content"  
      android:paddingTop="2dip"  
       android:paddingBottom="2dip"  
      android:paddingLeft="5dip"  
      android:text="@string/section2_title"
     style="?android:attr/listSeparatorTextViewStyle" />
      xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/item2_textview"  
    android:layout_width="fill_parent"  
     android:layout_height="fill_parent"  
     android:paddingTop="10dip"  
      android:paddingBottom="10dip"  
     android:paddingLeft="15dip"  
     android:textAppearance="?android:attr/textAppearanceLarge"  
  />

Dans ton on create, tu charges la vue avec ce layout. Et ensuite, tu peux récupérer chacun des TextView pour leur associer un KeyListener (ton Activity n'a plus besoin d'hériter de ListActivity, seulement de Activity)

public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.ma_vue);

       EditText eText = (EditText) findViewById(R.id.item1_textview);
       eText.setOnKeyListener(new MyKeyListener());

       EditText eText = (EditText) findViewById(R.id.item2_textview);
       eText.setOnKeyListener(new MyKeyListener());
}

(je ne garantis pas que mon code compile, je fais ça de tête, mais l'idée est là)

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...