Aller au contenu

ListView Editable


bbo1991

Recommended Posts

Je cherche un moyen simple et élégant pour afficher une liste de personnes et les éditer dans une grille.

Cette grille présenterait le nom de la personne + son âge dans un EditView.

L'utilisateur aura juste à modifier l'âge sur la grille.

Une implémentation très simple: une listview puis appel implémentation du listener onItemSelected + une boîte de dialogue pour éditer la personne sélectionnée. Sauf que moi je veux me passer de cette étape boîte dialogue... Je veux un champ de saisie de l'âge dans laquelle je modifie en direct mes infos.

Le problème auquel je suis confronté: si j'utilise un ListView, j'arrive à afficher l'âge dans un EditText mais je n'arrive pas à implémenter correctement un écouteur dessus.

J'ai essayé d'implémenter un listener dans ma classe Adapter pour la ListView, j'intercepte bien l'évènement onKey sur l'EditText mais impossible de savoir sur quelle personne je dois modifier l'âge saisi !!!

Bref si vous avez des suggestions ...

Lien vers le commentaire
Partager sur d’autres sites

Oui mais pour utiliser

items.get(position)

j'ai besoin justement de connaître l'argument "position".

Or dans mon code j'ai dû faire grosso modo ce genre de choses

PersonneArrayAdapter extends ArrayAdapter implements OnKeyListener{

   public View getView(int position, View listPersonne, ViewGroup parent){
          ....
         EditText age=(EditText) listePersonne.findViewById(R.id.age);
         age.setOnKeyListener(this);
          ..... 

  }

  public boolen onKeyEvent(...){
          Log.i("test","Age modifie");
  }

}

La méthode onKeyEvent (j'me souviens pas très bien du nom exact, là j'ai pas le code sous les yeux) répond bien quand je bouge l'âge mais je n'arrive justement pas à retrouver la "position" de l'item qui a bougé :(

Lien vers le commentaire
Partager sur d’autres sites

méthode simple : implémente le clic long et affiche un menu:

- modifier age

- supprimer

- etc ...

Tous les tutos sur les listview que j'ai glanés décrivent en effet ce type de solution. Mais moi pour le coup je voudrais accélérer l'interaction homme droid :P en évitant cette étape intermédiaire de saisie à travers un nouveau menu...

Lien vers le commentaire
Partager sur d’autres sites

utilise l'argument comme une variable connue.

items.get(position) (écrit tel quel) te donne l'objet personne correspondant à la bonne ligne.

Tu veux dire que dans ma classe PersonneArrayAdapter la variable "position" est une variable globale que je peux utiliser dans ma méthode onkeyEvent ???

Lien vers le commentaire
Partager sur d’autres sites

Perso je place dans le tag de la view que je fournis via getView() un élément permettant d'identifier l'item (view.setTag(myItemId)).

Ensuite sur le onClick de la view tu fais un view.getTag() pour retrouver ton marqueur.

Lien vers le commentaire
Partager sur d’autres sites

Perso je place dans le tag de la view que je fournis via getView() un élément permettant d'identifier l'item (view.setTag(myItemId)).

Ensuite sur le onClick de la view tu fais un view.getTag() pour retrouver ton marqueur.

Super ça marche nickel, je ne connaissais pas cet attribut Tag :)

Merci beaucoup

Lien vers le commentaire
Partager sur d’autres sites

Si tu ne connais pas le tag il faut que tu jettes un oeil aux convertViews et le principe des ViewHolders:

       /**
        * Make a view to hold each row.
        *
        * @see android.widget.ListAdapter#getView(int, android.view.View,
        *      android.view.ViewGroup)
        */
       public View getView(int position, View convertView, ViewGroup parent) {
           // A ViewHolder keeps references to children views to avoid unneccessary calls
           // to findViewById() on each row.
           ViewHolder holder;

           // When convertView is not null, we can reuse it directly, there is no need
           // to reinflate it. We only inflate a new View when the convertView supplied
           // by ListView is null.
           if (convertView == null) {
               convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

               // Creates a ViewHolder and store references to the two children views
               // we want to bind data to.
               holder = new ViewHolder();
               holder.text = (TextView) convertView.findViewById(R.id.text);
               holder.icon = (ImageView) convertView.findViewById(R.id.icon);

               convertView.setTag(holder);
           } else {
               // Get the ViewHolder back to get fast access to the TextView
               // and the ImageView.
               holder = (ViewHolder) convertView.getTag();
           }

           // Bind the data efficiently with the holder.
           holder.text.setText(DATA[position]);
           holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

           return convertView;
       }

       static class ViewHolder {
           TextView text;
           ImageView icon;
       }

From : http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

(voir également les présentations "Turbocharge your ui" de Romain Guy sur youtube).

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...