2016-05-28 13 views
0

Ich weiß nicht, was passiert, ich habe eine Liste von Objekten und je nach Status ist es aktiviert oder nicht (CheckBox). Ich habe zu viele Möglichkeiten ausprobiert, denn zuerst wollte ich eine ArrayList<myObject> mit dem Status aktualisiert, aber ich weiß nicht, warum die Objekte duplizieren ... und ich endete bei der Erstellung einer TreeSet (weiß nicht wenn es der bessere Weg ist, aber zumindest jetzt die Objekte wiederholt sich nicht) ... na ja die Sache ist, dass auf meinem Adapter ich habe dies:ArrayAdapter ändert den Wert der CheckBox

final Sessio sessio = getItem(position); 
    ALAdapter.add(sessio); 
    vh.tvSessioName.setText(sessio.getName()); 
    vh.cbAssist.setChecked(sessio.isState()); 
    vh.cbAssist.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      Toast.makeText(mContext, "chaning", Toast.LENGTH_SHORT).show(); 
      sessio.setState(isChecked); 
     } 
    }); 

AlAdapter ist private TreeSet<Sessio> ALAdapter;

dies funktioniert gut, Das Problem ist zu der Zeit, die ich den Dialog wieder öffne, weil ich die TreeSet auf einem json mit Gson wie folgt speichern:

Gson gson = new Gson(); 
String json = mPrefs.getString("ArrayListSesio", ""); 
Type type = new TypeToken <TreeSet<Sessio>>() {}.getType(); 
ArrayList<Sessio> obj = gson.fromJson(json,type); 
return obj == null ? AlSessio : obj; 

Dies funktioniert auch gut ... Ich denke, das Problem auf den Adapter ist, weil, wenn ich einige der CheckBox und ich ändere den Zustand der Sessio uncked, wenn ich die Dialog wieder öffnen zeigt die Toast wie 15 Mal ... und jedes Mal, wenn ich den Zustand der CheckBox Änderungen nach oben/unten scrollen ....

Was mache ich falsch? Gibt es einen anderen Weg, anstatt es zu speichern TreeSet speichern Sie es zu einem ArrayList?

+0

Verwenden Sie Listview? –

+0

@ VishweshJainkuniya Yep – Stuart2041

+0

Verwenden Sie Recycler-Ansicht als Kontrollkästchen in der Listenansicht nach dem Zufallsprinzip überprüft und deaktivieren. –

Antwort

2

Problem hier ist, dass die Ansichten wiederverwendet werden, so vor setChecked Methode sollten Sie dies tun:

vh.cbAssist.setOnCheckedChangeListener(null); 
vh.cbAssist.setChecked(sessio.isState()); 
vh.cbAssist.setOnCheckedChangeListener(/* your listener here */); 

Andernfalls setChecked mit Hörer auslösen.

+0

Erstaunlich, das hat den Trick gemacht ... Millionen Dank: D – Stuart2041

+0

Froh, dass ich helfen könnte :) – thetonrifles

+0

Yo @thetonrifles können Sie einen Blick darauf werfen? [link] (http://stackoverflow.com/questions/40489404/trie-data-structure-implementing-addword) – Stuart2041

Verwandte Themen