dream hope Posté(e) 5 octobre 2010 Share Posté(e) 5 octobre 2010 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 More sharing options...
chpil Posté(e) 6 octobre 2010 Share Posté(e) 6 octobre 2010 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 More sharing options...
dream hope Posté(e) 6 octobre 2010 Auteur Share Posté(e) 6 octobre 2010 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 More sharing options...
dream hope Posté(e) 6 octobre 2010 Auteur Share Posté(e) 6 octobre 2010 En utilisant le Tuto de Cyril Mottier, j'ai réussi à mettre un KeyListener à mon EditText, par contre, je n'arrive plus à afficher plusieurs section... Toujours en test donc. Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 7 octobre 2010 Share Posté(e) 7 octobre 2010 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 More sharing options...
dream hope Posté(e) 7 octobre 2010 Auteur Share Posté(e) 7 octobre 2010 Je ne vois pas comment, juste en définissant un layout, je peux créer des section dans ma liste (avec des entête non 'cliquable') ? La je suis un peu perdu... Lien vers le commentaire Partager sur d’autres sites More sharing options...
chpil Posté(e) 8 octobre 2010 Share Posté(e) 8 octobre 2010 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 More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.