检查后ListView复选框问题

时间:2016-04-25 10:31:21

标签: android listview checkbox

我的问题是,当我检查Checkbox时,它会转向检查,但它会复制检查状态,以查看可见列表中的下一个ListView项目(例如,当我可以看到项目时在一个屏幕上位置0-5 / 6,它位于位置7-8上的元素... ...

这是我的onClick方法:

viewHolder.messageSelectBox.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (viewHolder.messageSelectBox.isChecked()) {
                    Log.i("itemID", String.valueOf(getItemId(position)));
                    Log.i("position", String.valueOf(position));
                    mListOfItemsToDelete.add(position);
                    Collections.sort(mListOfItemsToDelete);
                    Collections.reverse(mListOfItemsToDelete);
                } else {
                    for (int i = 0; i < mListOfItemsToDelete.size(); i++) {
                        int pos = mListOfItemsToDelete.get(i);
                        if (pos == position) {
                            mListOfItemsToDelete.remove(i);
                        }
                    }
                }
            }
        });

setOnClickListener位于ListView适配器中的getView() ...

getView()方法:

final ViewHolder viewHolder;

        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = inflater.inflate(R.layout.messages_list_view_single, parent, false);
        }

        viewHolder = new ViewHolder(convertView);

        viewHolder.messageSelectBox = (CheckBox) convertView.findViewById(R.id.messageSelectBox);

那么伙计们,你知道出了什么问题吗?

2 个答案:

答案 0 :(得分:1)

getView()中,您必须在setOnClickListener之前加载已检查状态,如下所示。

viewHolder.messageSelectBox.setChecked(mListOfItemsToDelete.contains(position))

因此,检查状态将保留在mListOfItemsToDelete中,并使用该状态为复选框加载已选中状态。

答案 1 :(得分:1)

这是列表视图中非常常见的问题。发生此问题是因为当您滚动列表视图时重复使用列表项。所以你需要每次都要处理。

为此,您需要在模型类中使用布尔值。并选中复选框时,将Boolean的值设置为true / false。