我想设置ListView,每行包含CheckBox,TextView和ImageView。 我在实现中使用自己的适配器,但是当我向下滚动某些复选框时没有任何理由被选中: 例如,我选中第一行中的复选框(位于0位置),向下滚动并突然显示元素第17行也被检查,有时如果我转回到第一个复选框没有被选中。ListView中的复选框在滚动列表时混合
我用下面的代码:
private class ViewHolder{
ImageView image;
TextView name;
CheckBox selected;
}
private class BrowserAdapter extends ArrayAdapter<String> {
public BrowserAdapter(Context context, int resource, int textViewResourceId, List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView==null){
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.browser_list_row, parent, false);
holder = new ViewHolder();
holder.image = (ImageView) convertView.findViewById(R.id.browser_image);
holder.name = (TextView) convertView.findViewById(R.id.browser_file_name);
holder.name.setOnClickListener(ActionBar.this);
holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected);
holder.selected.setOnCheckedChangeListener(ActionBar.this);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
setViewInfo(holder.image, holder.name, holder.selected, position);
return convertView;
}
private void setViewInfo(ImageView image, TextView name, CheckBox selected , int position) {
name.setTag(position);
selected.setTag(position);
selected.setChecked(checkedItems[position]);
name.setText(myList.get(position));
File temp_file = new File(file, myList.get(position));
if (temp_file.isFile())
image.setImageResource(R.drawable.mp3file);
else
image.setImageResource(R.drawable.folder);
}
}//class BroswerAdapter
的参数checkedItems是一个布尔数组保存复选框的状态在列表类似下面的代码:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
checkedItems[(Integer)buttonView.getTag()] = isChecked;
}
能
请你帮我弄清楚我做错了什么?
编辑:当我使用每次调用getView函数时(不使用convertView)膨胀视图的天真方式,一切正常。
我也尝试将其更改为setChecked()方法,但复选框仍然混合,问题仍然存在。 – galvan 2013-03-27 23:06:58
在私有函数SetViewInfo()下,我将复选框的标记设置为位置。我也尝试记录我选择的每个复选框的编号,并打印每个复选框的正确编号。 – galvan 2013-03-27 23:20:16