2016-10-17 3 views
-1

J'ai un listView et il y a un toggleButton dans listView. Chaque fois que je clique sur la première ligne toggleButton, la neuvième ligne toggleButton sera également cliquée. Quand je défile vers le bas puis vers le haut, le premier toggleButton devient non cliqué mais les deuxième et dixième toggleButton sont cliqués. C'est vraiment étrange!Erreur dans ToggleButton ListView

public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.item_to_do, null); 
      holder= new ViewHolder(); 
      holder.text = (TextView) convertView.findViewById(R.id.task_title); 
      holder.time = (TextView) convertView.findViewById(R.id.time); 
      holder.date = (TextView) convertView.findViewById(R.id.date); 
      final ToggleButton toggle =(ToggleButton)convertView.findViewById(R.id.donePic); 
      toggle.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if (toggle.isChecked()) { 

         Toast.makeText(v.getContext(), "Clicked Laugh Vote", Toast.LENGTH_SHORT).show(); 

        } else { 
         Toast.makeText(v.getContext(), "Not Clicked Laugh Vote", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 

      convertView.setTag(holder); 
     } 
     holder = (ViewHolder) convertView.getTag(); 
     holder.text.setText(search.get(position).getTitle()); 
     holder.time.setText(search.get(position).getTime()); 
     holder.date.setText(search.get(position).getDate()); 
     return convertView; 
    } 

Quelqu'un sait d'où vient l'erreur?

+0

Vous pouvez jeter un oeil sur ma réponse ici: https://stackoverflow.com/questions/39926388/spannable-string-only-working-for-dernier-item-in-listview/39950834 # 39950834. Cela devrait être utile! –

Répondre

0

1: Votre bouton à bascule doit être dans le support.

holder.toggle = (ToggleButton) convertView.findViewById(R.id.toggle); 

2: En onClick lorsque vous vérifiez si elle est cliqué ou non, vous devez l'enregistrer dans votre liste search ainsi. La méthode isChecked() indique si le bouton bascule est coché ou non. Pour cela, vous devez définir un champ dans vos éléments de liste et enregistrer pour chaque élément l'état du bouton bascule.

Mise à jour 1:

Disons que vous avez une classe nommée MyObject et vous avez une liste d'entre eux dans votre adaptateur. Vous avez défini votre comme ceci: List<MyObject> search = new ArrayList<MyObject>(); et votre MyObject classe est comme ceci:

public class MyObject { 

    private String title; 
    private String time; 
    private String date; 
    private boolean checked; 

    public String getTitle(){ 
     return title; 
    } 

    public String getDate(){ 
     return date; 
    } 

    public String getTime(){ 
     return time; 
    } 

    public boolean isChecked(){ 
     return checked; 
    } 
    public void setChecked(boolean val){ 
     this.checked = val; 
    } 
} 

Maintenant, chaque fois que vous cliquez et changer la bascule, vous devez appeler setChecked sur cette position de point (au lieu de montrer du pain grillé) et puis quand vous voulez pour recréer des éléments, vous devez appeler holder.toggle.setChecked(search.get(position).isChecked())

Je l'espère vous aider

+0

isChecked ne peut pas être résolu –

+0

Vous devez écrire cette méthode dans votre objet si vous avez défini la liste 'search' comme ceci:' Liste ' –

+0

Je ne comprends pas :( –

0

Cela arrive parce que ListView recycle les vues. Vous devez toujours définir l'état ToggleButton, également lorsque ToggleButton ne doit pas être coché.

toggle.setChecked(isShouldBeChecked); 

Vous pouvez créer un tableau booléen contenant l'état de chaque ToggleButton. Si l'utilisateur vérifie un bouton, mettez à jour son statut dans le tableau.

0

Je suppose ListView ne reçoit pas la position du bouton pressé ma conjecture est de sauver t il position du bouton enfoncé dans le listView

   @Override 
       public void onClick(View v) { 



        //save the tag of the pressed button as position 
        position = (int)v.getTag(); 

        if (toggle.isChecked()) { 

         Toast.makeText(v.getContext(), "Clicked Laugh Vote", Toast.LENGTH_SHORT).show(); 

        } else { 
         Toast.makeText(v.getContext(), "Not Clicked Laugh Vote", Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 

et le transmettre au titulaire

holder = (ViewHolder) convertView.getTag(); 
     holder.text.setText(search.get(position).getTitle()); 
     holder.time.setText(search.get(position).getTime()); 
     holder.date.setText(search.get(position).getDate()); 
     return convertView;