我不知道发生了什么,我有一个对象列表,并根据其状态进行检查(CheckBox
)。
我尝试了太多方法,因为首先我想要更新状态ArrayList<myObject>
,但我不知道为什么对象是重复的......我最终创建了一个{{1 (不知道这是不是更好的方法,但至少对象现在不重复了)......好吧就是我的TreeSet
我有这个:
Adapter
AlAdapter是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);
}
});
这工作正常,问题是我重新打开对话框,因为我将private TreeSet<Sessio> ALAdapter;
保存在TreeSet
json
上,如下所示:
Gson
这也工作得很好......我认为问题出在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;
上,因为如果我取消了部分Adapter
,我会更改CheckBox
的状态 - 打开Sessio
它会显示Dialog
15次......每次我向上/向下滚动Toast
更改的状态....
我做错了什么?有没有其他方法可以将其另存为CheckBox
保存到TreeSet
?
答案 0 :(得分:2)
这里的问题是视图被重用,所以在使用setChecked
方法之前你应该这样做:
vh.cbAssist.setOnCheckedChangeListener(null);
vh.cbAssist.setChecked(sessio.isState());
vh.cbAssist.setOnCheckedChangeListener(/* your listener here */);
否则使用setChecked
将触发侦听器。