ArrayAdapter正在改变CheckBox的值

时间:2016-05-28 16:15:53

标签: java android checkbox

我不知道发生了什么,我有一个对象列表,并根据其状态进行检查(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

1 个答案:

答案 0 :(得分:2)

这里的问题是视图被重用,所以在使用setChecked方法之前你应该这样做:

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

否则使用setChecked将触发侦听器。