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

  1. #21
    Invité
    Invité(e)
    Par défaut
    Je pense que le code est bon, cependant j'ai l'impression que le teste est effectué uniquement lors du démarrage de l'apli, et donc lorsque je clique sur le bouton, comme je n'effectue pas le test ... je ne peux pas changer les couleurs.

    J'ai déclaré ma variable dans ma classe AlarmAdapter

    mais cela ne change pas grand chose...

  2. #22
    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
    Peux tu me poster tout ton code sur la partie liste , cela sera plus simple je pense ?

    Merci.

  3. #23
    Invité
    Invité(e)
    Par défaut
    Je déclare ma liste dans cette classe :

    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
     
    public class ListAlarme {
    	public final static int defaut = 1;
    	public final static int grave = 2;
     
    	public String idAlarme;
    	public String typeAlarme;
    	public int genre;
     
    	public ListAlarme(String aid, String atype, int aGenre) {
    		idAlarme = aid;
    		typeAlarme = atype;
    		genre = aGenre;
    	}
     
    	public static ArrayList<ListAlarme> getAListOfAlarms() {
    		ArrayList<ListAlarme> listAl = new ArrayList<ListAlarme>();
     
    		listAl.add(new ListAlarme("alarme1 ", "type1 ", defaut));
    		listAl.add(new ListAlarme("alarme2 ", "type2 ", grave));
    		listAl.add(new ListAlarme("alarme3 ", "type3 ", grave));
    		listAl.add(new ListAlarme("alarme4 ", "type4 ", defaut));
    		listAl.add(new ListAlarme("alarme5 ", "type5 ", defaut));
    		listAl.add(new ListAlarme("alarme6 ", "type6 ", grave));
    		listAl.add(new ListAlarme("alarme7 ", "type7 ", defaut));
    		listAl.add(new ListAlarme("alarme8 ", "type8 ", grave));
    		listAl.add(new ListAlarme("alarme9 ", "type9 ", grave));
    		listAl.add(new ListAlarme("alarme10", "type10", defaut));
    		listAl.add(new ListAlarme("alarme11", "type11", grave));
    		listAl.add(new ListAlarme("alarme12", "type12", grave));
    		listAl.add(new ListAlarme("alarme13", "type13", defaut));
    		listAl.add(new ListAlarme("alarme14", "type14", grave));
     
    		return listAl;
    	}
     
    	public String toString() {
    	     return "id : "+idAlarme+", type : "+typeAlarme+", genre : "+genre+".";
    	}
    }
    Mon adapter est déclaré ici :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    public class AlarmeAdapter extends BaseAdapter{
     
    	private static List<ListAlarme> mListA;
    	public int etat;
     
    	private Context mContext;
    	private LayoutInflater mInflater;
    	public AlarmeAdapter(Context context, List<ListAlarme> aListA) {
    		  mContext = context;
    		  mListA = aListA;
    		  mInflater = LayoutInflater.from(mContext);
    		}
    	public int getCount() {
    		  return mListA.size();
    		}
     
    	public Object getItem(int position) {
    		  return mListA.get(position);
    		}
     
    	public long getItemId(int position) {
    		  return position;
    		}
    	public View getView(final int position, View convertView, ViewGroup parent) 
    	{
    		  LinearLayout layoutItem;
    		  if (convertView == null) {
    		    layoutItem = (LinearLayout) mInflater.inflate(R.layout.alarme_layout, parent, false);
    		  } 
    		  else 
    		  {
    		  	layoutItem = (LinearLayout) convertView;
    		  }      
    		  TextView alarmeID = (TextView)layoutItem.findViewById(R.id.alarme_id);
    		  TextView alarmeType = (TextView)layoutItem.findViewById(R.id.alarme_type);		            
    		  alarmeID.setText(mListA.get(position).idAlarme);
    		  alarmeType.setText(mListA.get(position).typeAlarme);
     
    		if (etat == ManagementAlarm.NO_ACKKED ) 
              {
            	  layoutItem.setBackgroundColor(Color.GRAY);
              } 
              else 
              {
            	  ListAlarme item = mListA.get(position);
                  if (item.genre == ListAlarme.grave)
                	  layoutItem.setBackgroundColor(Color.RED);
                 else if (item.genre == ListAlarme.defaut)
                 {
                	 layoutItem.setBackgroundColor(Color.YELLOW);
                 }
     
              }
    			layoutItem.setTag(position);
    			layoutItem.setOnClickListener(new OnClickListener()
    			{
    					@Override
    					public void onClick(View v) 
    					{
    						Integer position = (Integer)v.getTag();
    						sendListener(mListA.get(position), position);						
    					}		        	
    		     }); 
    		        return layoutItem;
    	}		    
        private ArrayList<AlarmeAdapterListener> myListListener = new ArrayList<AlarmeAdapterListener>();
        public void addListener(AlarmeAdapterListener aListener) 
        {
        	myListListener.add(aListener);
        }
        private void sendListener(ListAlarme item, int position) 
        {
        	for(int i = myListListener.size()-1; i >= 0; i--) 
        	{
        		myListListener.get(i).onClick(item, position);
        	}
        }
     
     
    	public interface AlarmeAdapterListener 
    	{
    	  	public void onClick(ListAlarme item, int position);
     
    	}
    }

    Et voici ma classe principal, avec le menu :
    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
    60
    61
    62
    63
    64
    65
     
    public class ManagementAlarm extends Activity implements AlarmeAdapterListener{
        /** Called when the activity is first created. */
        public final static  int ACKKED = 1;
        public final static  int NO_ACKKED = 0;
        public int etat;
        @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);   
            etat = NO_ACKKED;
     
        }
     
        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, "select an alarm", Toast.LENGTH_LONG).show();
                                     break;
                 case R.id.ackall:Toast.makeText(this, "Acknowledge all alarms", Toast.LENGTH_LONG).show(); 
                 etat = ACKKED;         
                                     break;
                 case R.id.reset:Toast.makeText(this, "Select an 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;
         }
    Encore merci pour ton aide =)

  4. #24
    Invité
    Invité(e)
    Par défaut
    J'ai beau tenté plusieurs façon de déclarer la variable etat le problème reste le même, est-ce que je l'ai déclaré au mauvais endroit? je ne pense pas qu'il faille la déclarer dans les 2 classes comme je l'ai fait ci-dessus ....

  5. #25
    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 beau tenté plusieurs façon de déclarer la variable etat le problème reste le même, est-ce que je l'ai déclaré au mauvais endroit? je ne pense pas qu'il faille la déclarer dans les 2 classes comme je l'ai fait ci-dessus ....
    Effectivement

    Donc enlève la variable etat de ton activity elle sert à rien après dans le constructeur de ton adapter .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public AlarmeAdapter(Context context, List<ListAlarme> aListA, int state) {
    		  mContext = context;
    		  mListA = aListA;
    		  mInflater = LayoutInflater.from(mContext);
                     etat = state;
    		}
    Pour construire ton adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AlarmeAdapter adapter = new AlarmeAdapter(this, listP,NO_ACKKED); // ou ACKKED
    Pour mettre à jour ta variable etat :
    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
    public boolean onOptionsItemSelected(MenuItem item) {
             switch (item.getItemId()) {
                 case R.id.ack:Toast.makeText(this, "select an alarm", Toast.LENGTH_LONG).show();
                                     break;
                 case R.id.ackall:Toast.makeText(this, "Acknowledge all alarms", Toast.LENGTH_LONG).show(); 
                ListView list = (ListView)findViewById(R.id.listalarme);
                AlarmeAdapter adapter = (AlarmeAdapter)list.getAdapter();
                adapter.setEtat(ACKKED);
                list.invalidate(); // ou tu fais un noitify sur ton adapter 
                                     break;
                 case R.id.reset:Toast.makeText(this, "Select an 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;
         }

    Dans ton adapter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setEtat (int nvetat) {
       etat = nvetat;
    }
    Après je pense que d'avoir ta liste dans l'adapter en static n'est pas forcément nécessaire.

  6. #26
    Membre expérimenté
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Par défaut
    Dans le code ci-dessus il n'y aucune relation entre la variable etat de la classe "AlarmeAdapter" et "ManagementAlarm".

    Pourquoi ne pas laisser etat dans "AlarmeAdapter" ensuite faire un mutateur (setEtat).

    Dans "ManagementAlarm" au niveau de "onOptionsItemSelected" il faudra faire mAlarmeAdpter.setEtat(nouvelle_valeur).

    Ensuite certainement qu'il faut notifier le changement ou forcer le refresh de la liste pour que l'affichage change.

    P.S : j'ai pas tout lu donc peut-être que la solution a déjà été proposé.

    EDIT : Feanorin a parfaitement illustré ce que je disais

  7. #27
    Invité
    Invité(e)
    Par défaut
    @Aerinder

    ta solution a été proposé par feanorin.

    cependant que je mette

    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adapter.notifyDataSetChanged();
    cela ne fonctionne pas.

    Est-ce que le test est bien codé dans l'adapter :

    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
     
    		if (etat == ManagementAlarm.ACKKED ) 
              {
            	  layoutItem.setBackgroundColor(Color.GRAY);
              } 
              else 
              {
            	  ListAlarme item = mListA.get(position);
                  if (item.genre == ListAlarme.grave)
                	  layoutItem.setBackgroundColor(Color.RED);
                 else if (item.genre == ListAlarme.defaut)
                 {
                	 layoutItem.setBackgroundColor(Color.YELLOW);
                 }
     
              }

  8. #28
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Feanorin Voir le message
    Après je pense que d'avoir ta liste dans l'adapter en static n'est pas forcément nécessaire.
    Effectivement, j'ai enlevé le static

    Je suppose qu'il faut quand même laissé la déclaration des int ACKKED et NO_ACKKED dans mon activity non?

  9. #29
    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
    Je suppose qu'il faut quand même laissé la déclaration des int ACKKED et NO_ACKKED dans mon activity non?
    Hmm à ta place je les déplacerais dans l'adapter. Il faut que les deux classes y ont accès puisque les deux l'utilisent , comme ton activity doit déjà surement importé la class de ton adapter alors la place de ces déclarations seront plus intelligentes dans ton adapter.

    Après tu peux les laisser dans ton activity ou même les positionner dans un fichier Commun qui te permettra de centraliser toutes tes déclarations static.

    Edit :
    J'avais pas fais gaffe au premier post , essaye de mettre des Log pour voir si la valeur de ta variable etat ainsi que pour voir si tu rentres bien dans le bon cas lors de la sélection de ton background.

  10. #30
    Invité
    Invité(e)
    Par défaut
    Lorsque je lance mon appli, je rentre bien dans le bon cas du test (cad NO_ACCKED) et ma liste et rouge et jaune.

    cependant dés que je clique sur le bouton je ne rentre pas dans le test, je pense que tout le problème vient de là, comment faire un sorte que mon programme refasse ce test à chaque fois que je clique sur le bouton.

    si ça peut t'aider lorsque jai cliqué sur le bouton mon logcat m'a affiché ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    06-01 09:51:11.568: WARN/KeyCharacterMap(414): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
    06-01 09:51:13.458: WARN/InputManagerService(58): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44f76f30
    je ne sais pas si c'est utile.

    En tout cas si le test ne s'effectue pas, le problème ne vient pas de la déclaration des variables ...

  11. #31
    Invité
    Invité(e)
    Par défaut
    Est-il possible de faire le test en dehors du getView? car cette méthode ne se lance qu'au lancement de l'appli, on en revient pas dessus je me trompe?

  12. #32
    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

  13. #33
    Invité
    Invité(e)
    Par défaut
    Merci ça marche avec invalidateViews() Génial =D

  14. #34
    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.
Page 2 sur 2 PremièrePremière 12

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