ListView多选问题?

时间:2013-11-20 07:23:40

标签: android listview checkbox arraylist

我有一个带有图像视图和复选框的列表视图。现在问题是当我检查第一个复选框,并且我向下滚动列表时,其他复选框也会被检查。

例如,如果我选中第一个复选框,则第5个复选框也会被检查,依此类推。现在我已经在我的getView中做了一些事情,这样就会删除这个错误,但是当我滚动时,它再次被取消选中。 这是我的getView()方法

positionArray = new ArrayList<Boolean>(rowItems.size());
    for(int i = 0; i < rowItems.size(); i ++)
        positionArray.add(false);
//------------------------------------------ the above code is in oncreate


public View getView(final int position, View convertView, ViewGroup parent) {

        RowItem rowItem = getItem(position); //List of Items
        ViewHolder holder = new ViewHolder();
        if (convertView == null) {

            LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            convertView = mInflater.inflate(R.layout.list_item, null);
            holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
            holder.radio1 = (CheckBox) convertView.findViewById(R.id.radio);
            convertView.setTag(holder);
        } 
        else{
            holder = (ViewHolder) convertView.getTag();
        }
        //holder.radio1.setChecked(positionArray.get(position));
        holder.radio1.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
                if(isChecked)
                    positionArray.set(position, true);


            }
        });
        imageLoader.displayImage(rowItem.getimageUrl(), holder.imageView, options, animateFirstListener);

        return convertView;
    }

2 个答案:

答案 0 :(得分:3)

getView()您必须更新视图,以显示是否选择了项目。只需取消注释该行:

holder.radio1.setChecked(positionArray.get(position));

了解为什么会发生这种情况非常重要。看看这个答案:

更新:您没有取消设置数组中的值(isChecked=false时)

positionArray.set(position, isChecked);

如果上述方法不起作用,我建议您根据此方法更改解决方案:

答案 1 :(得分:1)

复选框在滚动时不保留它的值,因为当我们滚动时, ListView会再次创建它的视图。

你可以做的是:将选中的项目插入到一个arraylist中,然后每当你选中一个复选框时更改arraylist中的值。

如果您检查任何项目,则添加到arraylist中,否则在取消选中任何在getview方法中早期选择的项目时将其删除。