IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants graphiques Android Discussion :

ListView et sélection/clic


Sujet :

Composants graphiques Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut ListView et sélection/clic
    Bonjour à tous,

    Je continue mon apprentissage de l'API android, voici ce que j'aimerais faire : lorsqu'un item d'une ListView est cliqué/sélectionné, je voudrais changer sa couleur de fond (pour indiquer quel item de la liste est sélectionné). L'item garderait cette nouvelle couleur jusqu'à ce qu'un autre item soit cliqué/sélectionné...

    J'ai essayé plusieurs façons de faire, notamment en changeant le fond dans un AdapterView.OnItemClickListener, le problème est que lorsque l'adapteur recycle les vues (cf. le paramètre convertView de Adapter.getView), la vue avec le fond modifié réapparaît autre part dans la ListView.
    J'ai également essayé d'utiliser l'attribut android:listSelector, mais l'item ne change de couleur que pendant la durée du clic...

    Quelle est la solution à ce problème ?
    Merci !

  2. #2
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,
    J'ai essayé plusieurs façons de faire, notamment en changeant le fond dans un AdapterView
    Comment as tu fait ?

    Car je pense que en passant par l' inflater de ta view, tu dois avoir moyen de pouvoir changer les couleurs de fond comme tu veux , ou tu peux aussi passer par la procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public View getView(int position, View contentView, ViewGroup arg2)

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Avec le OnItemClickListener j'avais teste comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    mListView.setOnItemClickListener(new ListView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            view.setBackgroundColor(Color.RED);
        }	
    });
    Le fond passe bien en rouge lors d'un clic, le probleme est que lorsque je fais defiler la liste, un autre item apparait en rouge a cause du recyclage de la View par l'adapteur...

  4. #4
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Essaye plutôt en créant toi même ton adapter ,

    http://developer.android.com/referen...w.ViewGroup%29

    Il te suffira pour cela de modifier ta vue obtenue en fonction de la position sélectionnée .

    Un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class TonAdapter extends ArrayAdapter {
     
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             View view = convertView;
     
                if (view == null)
                {            
                    LayoutInflater li = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    //le layout représentant la ligne dans le listView
                    view = li.inflate(R.layout.list_view, null); 
                }         
     
               // maintenant tu peux travailler ta view qui correspond à une ligne 
              // si la ligne correspond à l'élément sélectionnée préalablement tu change son fond .
     
     
             return view;
     
         }
    }

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Par défaut
    Effectivement, c'est mieux en changeant le fond a partir de l'adapteur...Encore une fois merci Feanorin pour ton aide !

  6. #6
    Invité
    Invité(e)
    Par défaut
    j'ai un problèem un peu différent,

    Je voudrais changer la couleur de fond de ma listView mais à partir d'un bouton du menu que j'ai créer ... et je n'y arrive pas.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    public class ManagementAlarm extends Activity implements AlarmeAdapterListener{
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
     
            ArrayList<ListAlarme> listP = ListAlarme.getAListOfAlarms();
            AlarmeAdapter adapter = new AlarmeAdapter(this, listP);
            adapter.addListener(this); 
            ListView list = (ListView)findViewById(R.id.listalarme);
            list.setAdapter(adapter);   
        }
     
        public void onClick(ListAlarme item, int position) {
     
        	String idalr = ListAlarme.getAListOfAlarms().get(position).idAlarme;
        	String typealr = ListAlarme.getAListOfAlarms().get(position).typeAlarme;
        	int genrealr = ListAlarme.getAListOfAlarms().get(position).genre;
     
          	Intent intenalr1 = new Intent();
        	intenalr1.putExtra("id", idalr); 
        	intenalr1.putExtra("type", typealr); 
        	intenalr1.putExtra("genre", genrealr); 
        	intenalr1.putExtra("Position", position);
        	intenalr1.setClass(this, DetailAlarm.class);
    	    startActivity(intenalr1); 
       } 
     
        /**-----------------------------Barre de Menu----------------------------*/
     
        public boolean onCreateOptionsMenu(Menu menu) 
        {
           super.onCreateOptionsMenu(menu);
           MenuInflater inflater = new MenuInflater(this);
           inflater = getMenuInflater();
           inflater.inflate(R.menu.menu, menu);
           return true;
        }
         public boolean onOptionsItemSelected(MenuItem item) {
             switch (item.getItemId()) {
                 case R.id.ack:Toast.makeText(this, "Acknowledge this alarm", Toast.LENGTH_LONG).show();
                 //Mettre l'alarme choisi en gris
                                     break;
                 case R.id.ackall:Toast.makeText(this, "Acknowledge all alarms", Toast.LENGTH_LONG).show();
                 ((TextView)findViewById(R.id.alarme_id)).setBackgroundColor(Color.GRAY);
                 ((TextView)findViewById(R.id.alarme_type)).setBackgroundColor(Color.GRAY);            
                                     break;
                 case R.id.reset:Toast.makeText(this, "Reset this alarm", Toast.LENGTH_LONG).show();
                                     break;
                 case R.id.resetall:Toast.makeText(this, "Reset all alarms", Toast.LENGTH_LONG).show();             		
                 					 break;    
                 case R.id.update:Toast.makeText(this, " alarms update", Toast.LENGTH_LONG).show();          
                 					 break;             
             }
             return true;
         }
    }
    Je voudrais mettre cette action sur le bouton ackall de mon menu, mais les lignes de codes que j'ai mises fonctionnent uniquement sur la première ligne de ma listView, soit la ligne 0 passe en grise mais pas les autres, une idée de solution?

    j'ai essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((ListView)findViewById(R.id.listalarme)).setBackgroundColor(Color.GRAY);
    Mais ça ne change pas du tout la couleur.

    Merci

  7. #7
    Invité de passage
    Homme Profil pro
    Analyse système
    Inscrit en
    Février 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 1
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Essaye plutôt en créant toi même ton adapter ,

    http://developer.android.com/referen...w.ViewGroup%29

    Il te suffira pour cela de modifier ta vue obtenue en fonction de la position sélectionnée .

    Un exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class TonAdapter extends ArrayAdapter {
     
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             View view = convertView;
     
                if (view == null)
                {            
                    LayoutInflater li = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    //le layout représentant la ligne dans le listView
                    view = li.inflate(R.layout.list_view, null); 
                }         
     
               // maintenant tu peux travailler ta view qui correspond à une ligne 
              // si la ligne correspond à l'élément sélectionnée préalablement tu change son fond .
     
     
             return view;
     
         }
    }
    J'ai ajouter ceci à ton code car j'ai une custom listView
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                String SingleNameItem = getItem(position);
                TextView tV= (TextView) customView.findViewById(R.id.tV);
                tV.setText(SingleNameItem);
                // Condition ??
    Et dans le listner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    view.setBackgroundColor(Color.RED);
                }
    Le problème c'est que j'arrive pas à trouver la condition adéquate afin d'éviter de retrouver en bas de la liste des items sélectionnés à cause du recyclage de la liste. Merci d'avance.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Listview éviter sélection par défaut
    Par danisoaz dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/08/2011, 10h47
  2. Listview problème sélection
    Par hugobosscool26 dans le forum C#
    Réponses: 2
    Dernier message: 21/09/2007, 11h59
  3. Listview et sélection
    Par Aleksis dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/09/2006, 14h26
  4. [C#] Sélection clic droit TreeView
    Par fremsoi dans le forum Windows Forms
    Réponses: 4
    Dernier message: 16/01/2006, 23h37
  5. [débutant] Listview et double-clic
    Par Runlevel dans le forum C++Builder
    Réponses: 12
    Dernier message: 29/06/2004, 19h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo