2011-01-10 7 views
2

Ich habe eine Listview mit benutzerdefinierten BaseAdapter und jede Zeile enthält ein Kontrollkästchen und drei Textansichten. Ich verwende Layoutinflater, um diese Zeile aus einer XML-Datei aufzublasen. Jedes Mal, wenn ich ein Kontrollkästchen ankreuze, werden viele andere Kontrollkästchen in der gesamten Liste aktiviert, während das ursprüngliche Kontrollkästchen, das ich überprüfen möchte, manchmal selbst überprüft wird, und manchmal nicht.Checkboxen in Android Listview mit Problem

Jedes Mal, wenn ein Benutzer ein Kontrollkästchen auswählt, speichere ich den angefügten eindeutigen Wert dieses Kontrollkästchens in einer Sammlung. Beim nächsten Aufruf der getView-Methode aktiviere/deaktiviere ich das Kontrollkästchen manuell, bevor ich die Ansicht in getView() zurücksende, je nachdem ob der Wert des Kontrollkästchens bereits in der Sammlung war oder nicht. Aber obwohl dies getan wird, markiert es immer noch diese Checkboxen, obwohl der CheckedChangelistener für diese Checkboxen nicht hochfährt. Ich bin zweifelhaft dies wegen der Ansichten in getView wiederverwendet werden, aber weiß nicht, was ist ein guter Weg, um das Ganze zum Funktionieren zu bekommen.

+2

Können Sie Ihre getView-Methode hier einbeziehen. Ich vermute, das Problem ist da. – Juhani

+0

http://stackoverflow.com/questions/5715630/checkboxes-in-the-list-randomly-get-checked-unched-when-i-scroll-through-and/7076486#7076486 Dies ist bereits besprochen, Sie können gehen durch damit. Vielen Dank. – SALMAN

Antwort

3

das Problem ist definitiv in Ihrer getView() -Methode; N_JOY:

so etwas wie diese

public View getView(int position, View convertView, ViewGroup parent) { 
     View vu = convertView; 
     ViewHolder vHolder = null; 
     try { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      if (vu == null) { 
       vu = (View) inflater.inflate(R.layout.list_fr_req, null); 
       vHolder = new ViewHolder(); 
       vHolder.checkbox = (CheckBox) vu.findViewById(R.id.my_ChkBox); 
       vu.setTag(vHolder); 
      } else { 
       vHolder = (ViewHolder) vu.getTag(); 
      } 
      vHolder.checkbox.setOnCheckedChangeListener(this); 

      vHolder.checkbox.setId(position); 
      vHolder.textView.setId(position); 

      if (myList.get(position).getCheckedStatus()) 
       vHolder.checkbox.setChecked(true); 
      else 
       vHolder.checkbox.setChecked(false); 

     } catch (Exception e) { 
      Log.d("Exception in getview", e + ""); 
      e.printStackTrace(); 
     } 
     return vu; 
    } 

    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      list.get(buttonView.getId()).setCheckedStatus(true); 
     } else { 
      list.get(buttonView.getId()).setCheckedStatus(false); 
     } 
    } 

    public static class ViewHolder { 
     CheckBox checkbox; 
     TextView textview; 
    } 

Grüße Versuchen.

+0

Ich bin mir nicht sicher, aber wenn Sie vHolder.Checkbox.setChecked aufrufen (false); (im Listener), der onCheckedChangeListener wird vom System nicht erneut aufgerufen? –

+2

hey Kumpel das ist mein Code und es funktioniert gut. Das war keine Frage, ich habe eine Antwort geschrieben. –

+0

in einigen Android-Telefon, löst SetChecked() auch onCheckedChanged() aufgerufen werden, was zu unerwarteten Ergebnissen führen wird. – shihpeng

6

Vermeiden if (convertView == null) und sonst ganzen Teil Es wird definitiv für Sie arbeiten. Vielen Dank.

+0

heraus geht die Vorteile von Convertview. aber das ist eine schnelle Lösung –

0

Verwenden Sie den OnClickListener anstelle von OnCheckedChangeListener. Letzteres wird auch dann ausgelöst, wenn Sie die wiederverwendbare Ansicht aktualisieren, damit sie dem Wert des Objekts entspricht. Im folgenden Codeabschnitt einer getView() verwende ich eine HashMap, um den Prüfwert der Objekte (itemMap) zu speichern.

  boolean checked=itemMap.get(currentObject); 
      if(checked!=checkBox.isChecked()) 
       checkBox.setChecked(checked); 
      checkBox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        CheckBox checkBox1=(CheckBox)v; 
        if(checkBox1.isChecked()) //ckecked 
        { 
         itemMap.put(currentObject,true); 
         if(checkListener!=null) 
          checkListener.onCheck(position,convertView,parent,adapter); 
        } 
        else{ //unchecked 
         itemMap.put(currentObject,false); 
         if(checkListener!=null) 
          checkListener.onUnCheck(position,convertView,parent,adapter); 
        } 
       } 
      }); 

checkListener ist ein zusätzlicher Listener, der vom Benutzer der Klasse hinzugefügt werden kann.