0

我想制作一个列表视图,其中一个项目包含一个文本和一个复选框,而对于复选框侦听器,我想使用 onCheckedChange。我不明白这个监听器的行为,因为当我从列表顶部检查一个项目然后我向下滚动并返回顶部时,我的复选框状态未选中,但如果我在列表中播放更多,它似乎工作一般。我不明白我是否使用了不正确的 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);
    }}

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

谁能解释我的错在哪里?谢谢

4

2 回答 2

1

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

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

holder.cbSelectFriend.setTag(item);
holder.cbSelectFriend.setChecked(item.isChecked());
于 2015-05-17T15:06:39.517 回答
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

于 2015-05-17T14:13:01.883 回答