2016-08-08 11 views
0

Etwas seltsames passiert, wenn ich auf eine Zeile in der Liste klickt, wird auch das entsprechende Kontrollkästchen ausgewählt. So ist alles richtig, aber das Seltsame ist, dass automatisch alle 7 Zeilen das Kontrollkästchen auf True gesetzt wird. Was ist das Problem? Danke für Ihre HilfeAndroid Listview getView CheckBox

ListAdapter adapter = new ArrayAdapter<Dettaglio1> 
      (this, R.layout.deteails_list_pdf, R.id.tv_nome_categoria, dettagli1) { 
@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      View row = super.getView(position, convertView, parent); 
... 
... 
list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
        final Dettaglio1 d1 = dettagli1.get(position); 

        d1.setChecked(!d1.isChecked()); 

        CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox2); 
        checkBox.setChecked(d1.isChecked()); 

       } 
      }); 
      return row; 
     } 
    }; 
    list.setAdapter(adapter); 

private class Dettaglio1 { 
    String nome; 

    private boolean isChecked; 

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

    public boolean isChecked() { 
     return isChecked; 
    } 
} 
+0

Können Sie Ihre Layoutdatei posten? – manfcas

Antwort

1

Was passiert ist bekannt als Ansicht Recycling - den Kern Mechanismus hinter ListView und RecyclerView. Jede siebte CheckBox wird überprüft, weil das gleiche CheckBox recycelt und mit seinem vorherigen Zustand angezeigt wird.

Um das Problem zu beheben, müssen Sie den Status "checked" in Ihrem Datenmodell (Klasse Dettaglio1) beibehalten. Zum Beispiel können Sie Ihr Datenmodell wie so ändern:

public class Dettaglio1 { 
    // stuff 
    private boolean isChecked; 

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

    public void isChecked() { 
     return isChecked; 
    } 
    // more stuff 
} 

Und Ihre Zuhörer wie so:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    final Dettaglio1 d1 = dettagli1.get(position); 
    d1.setChecked(!d1.isChecked()); 

    CheckBox checkBox = (CheckBox) view.findViewById(R.id.checkBox2); 
    checkBox.setChecked(d1.isChecked()); 
} 

Edit: Sie müssen auch Ihre Adapters getView() Methode und stellen Sie die CheckBox außer Kraft zu setzen ist der geprüfte Zustand gemäß der Dettaglio1 an der aktuellen Position.

+0

Diese Lösung löst das Problem nicht. Ich habe meinen Beitrag bearbeitet – user2847219

+0

Oh, richtig. Hat meinen Beitrag bearbeitet. – npace