簡體   English   中英

ArrayAdapter更改CheckBox的值

[英]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;

這工作正常,問題出在我重新打開對話框時,因為我將TreeSetGson一起保存在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM