ListView中的OnCheckedChangeListener

时间:2015-05-17 13:40:20

标签: android listview checkbox oncheckedchanged

我想创建一个列表视图,其中一个项目包含一个文本和一个复选框,对于我想要使用onCheckedChange的复选框监听器。我没有理解这个监听器的行为,因为当我从列表顶部检查一个项目然后向下滚动并返回顶部时,我的复选框状态未被选中但是如果我在列表中玩更多它似乎正常工作。我不明白我是否使用unproper onCheckedChangeListener,或者它是一个普遍的问题。 所以这是我的代码的一部分:

 public View getView(int position, View convertView, ViewGroup parent) {
PickerItemDto item = items.get(position);

if (convertView == null) {
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    convertView = mInflater.inflate(R.layout.picker_item, null);

    ViewHolder viewHolder = new ViewHolder(convertView);
    viewHolder.checkboxChange= new OnCheckboxChange();
    viewHolder.cbSelectFriend.setOnCheckedChangeListener(viewHolder.checkboxChange);

    convertView.setTag(viewHolder);
}
    ViewHolder holder = (ViewHolder) convertView.getTag();

    holder.tvName.setText(item.getName());
    holder.cbSelectFriend.setChecked(item.isChecked());
    holder.cbSelectFriend.setTag(item);}

private class OnCheckboxChange implements CompoundButton.OnCheckedChangeListener {

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        CheckBox cb= (CheckBox) buttonView;
        PickerItemDto item = (PickerItemDto) cb.getTag();

        item.setChecked(isChecked);
    }}

据我测试,问题是因为当我查看列表时,onCheckboxChanged被多次调用,并且isChecked值出现“false' false对于我已经检查过的元素。 我知道我可以使用onClickListener,但我需要onCheckBoxChange,因为我想使用一个库,只有这个监听器可用。

任何人都可以解释我的错误吗?谢谢

2 个答案:

答案 0 :(得分:1)

您的问题的简单答案是替换

holder.cbSelectFriend.setChecked(item.isChecked());
holder.cbSelectFriend.setTag(item);  

holder.cbSelectFriend.setTag(item);
holder.cbSelectFriend.setChecked(item.isChecked());

答案 1 :(得分:0)

滚动时多次调用

onCheckboxChanged,因为每次ListView重用视图时,您都会设置新的选中值:

holder.cbSelectFriend.setChecked(item.isChecked());

如果您每次都使用OnCheckboxChange方法创建新的getView,则可以修复此问题(现在仅在OnCheckboxChange时创建新的convertView == null):

if (convertView == null) {
    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    convertView = mInflater.inflate(R.layout.picker_item, null);

    ViewHolder viewHolder = new ViewHolder(convertView);
    convertView.setTag(viewHolder);
}

ViewHolder holder = (ViewHolder) convertView.getTag();
holder.cbSelectFriend.setOnCheckedChangeListener(new OnCheckboxChange());
holder.cbSelectFriend.setChecked(item.isChecked());

但这不是最佳方式。 更简单干净的方法就是使用OnItemClickListener