Android 滚动列表时,ListView中的复选框混合

Android 滚动列表时,ListView中的复选框混合,android,checkbox,android-listview,Android,Checkbox,Android Listview,我试图设置一个列表视图,每行包含复选框、文本视图和图像视图。 我在实现中使用我自己的适配器,但当我向下滚动时,一些复选框被选中,没有任何原因: 例如,我选中第一行中的复选框(在0位置),向下滚动,突然第17行中的元素也被选中,有时如果我返回到第一行,复选框不会被选中 我使用了以下代码: private class ViewHolder{ ImageView image; TextView name; CheckBox selected; }

我试图设置一个列表视图,每行包含复选框、文本视图和图像视图。 我在实现中使用我自己的适配器,但当我向下滚动时,一些复选框被选中,没有任何原因: 例如,我选中第一行中的复选框(在0位置),向下滚动,突然第17行中的元素也被选中,有时如果我返回到第一行,复选框不会被选中

我使用了以下代码:

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
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

    checkedItems[(Integer)buttonView.getTag()] = isChecked;

}
你能帮我找出我做错了什么吗


编辑:每次调用getView函数时,我都会使用一种简单的方法来扩展视图(不使用convertView),这一切都很好

错误:

您正在使用
setSelected
,而您应该使用 在
复选框上,如下所示查看:

selected.setChecked (checkedItems[position]);
holder.selected.setTag ("" + position);
checkedItems[Integer.parseInt (buttonView.getTag())] = isChecked;
setSelected方法设置一行中的行的选择状态
ListView
(或另一个
AdapterView

编辑:

setOnCheckedChangeListener
设置为
复选框查看。然后,尝试读取
setOnCheckedChangeListener
设置为的视图的标记——这是
复选框。但是,您从未设置
复选框的标记!因此,您在
setOnCheckedChangeListener
中读取的标记是错误的

您必须这样设置:

selected.setChecked (checkedItems[position]);
holder.selected.setTag ("" + position);
checkedItems[Integer.parseInt (buttonView.getTag())] = isChecked;
。。。然后,在
设置的checkedChangeListener
中,这样读:

selected.setChecked (checkedItems[position]);
holder.selected.setTag ("" + position);
checkedItems[Integer.parseInt (buttonView.getTag())] = isChecked;

将以下行移到if语句之外

 holder.name.setOnClickListener(ActionBar.this);
 holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected);
 holder.selected.setOnCheckedChangeListener(ActionBar.this);

我还尝试将其更改为setChecked()方法,但复选框仍然混合,问题仍然存在。在私有函数SetViewInfo()下,我将复选框的标记设置为位置。我还尝试记录我选择的每个复选框的编号,它会打印每个复选框的正确编号。