[英]ArrayAdapter is changing the value of the CheckBox
我不知道發生了什么,我有一個對象列表,根據它是否被檢查( CheckBox
)的狀態而定。 我已經嘗試了太多方法,因為首先我想返回狀態已更新的ArrayList<myObject>
,但是我不知道為什么對象會重復...而最終我創建了TreeSet
(不要不知道這是否是更好的方法,但是至少現在不重復對象了。。。好吧,這是在我的Adapter
我有這個:
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是private TreeSet<Sessio> ALAdapter;
這工作正常,問題出在我重新打開對話框時,因為我將TreeSet
與Gson
一起保存在json
上,如下所示:
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
並在重新打開Dialog
時更改了Sessio
的狀態,它會顯示Toast
Sessio
15次...並且每次我上下滾動CheckBox
的狀態都會改變。
我做錯了什么? 還有其他方法可以代替將其保存到TreeSet
並將其保存到ArrayList
嗎?
這里的問題是視圖被重用,因此在使用setChecked
方法之前,您應該這樣做:
vh.cbAssist.setOnCheckedChangeListener(null);
vh.cbAssist.setChecked(sessio.isState());
vh.cbAssist.setOnCheckedChangeListener(/* your listener here */);
否則,使用setChecked
將觸發偵聽器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.