我有一个带有图像视图和复选框的列表视图。现在问题是当我检查第一个复选框,并且我向下滚动列表时,其他复选框也会被检查。
例如,如果我选中第一个复选框,则第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;
}
答案 0 :(得分:3)
在getView()
您必须更新视图,以显示是否选择了项目。只需取消注释该行:
holder.radio1.setChecked(positionArray.get(position));
了解为什么会发生这种情况非常重要。看看这个答案:
更新:您没有取消设置数组中的值(isChecked=false
时)
positionArray.set(position, isChecked);
如果上述方法不起作用,我建议您根据此方法更改解决方案:
答案 1 :(得分:1)
复选框在滚动时不保留它的值,因为当我们滚动时, ListView会再次创建它的视图。
你可以做的是:将选中的项目插入到一个arraylist中,然后每当你选中一个复选框时更改arraylist中的值。
如果您检查任何项目,则添加到arraylist中,否则在取消选中任何在getview方法中早期选择的项目时将其删除。