0

我正在尝试设置每行包含 CheckBox、TextView 和 ImageView 的 ListView。我在实现中使用自己的适配器,但是当我向下滚动时,无缘无故地检查了一些复选框:例如,我检查了第一行中的复选框(在 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

参数checkedItems 是一个布尔数组,用于保存列表中复选框的状态,如下面的代码所示:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

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

}

你能帮我弄清楚我做错了什么吗?

编辑:当我每次调用getView函数(不使用convertView)时,我都使用一种简单的方式来膨胀视图,一切都很好。

4

2 回答 2

0

将以下行移到 if 语句之外

 holder.name.setOnClickListener(ActionBar.this);
 holder.selected = (CheckBox) convertView.findViewById(R.id.browser_selected);
 holder.selected.setOnCheckedChangeListener(ActionBar.this);
于 2013-03-27T23:54:53.483 回答
-1

错误的:

您正在使用setSelected,而您应该像这样 在视图上使用setChecked :CheckBox

selected.setChecked (checkedItems[position]);

setSelected 方法设置a (或 another )中行的选择状态。ListViewAdapterView

编辑:

您将 设置setOnCheckedChangeListenerCheckBox视图。然后,您尝试读取setOnCheckedChangeListener设置为的视图的标签——这是CheckBox. CheckBox但是,您永远不会设置!的标签。所以,你读到的标签setOnCheckedChangeListener是错误的。

你必须这样设置:

holder.selected.setTag ("" + position);

...然后,在 中setOnCheckedChangeListener,像这样阅读:

checkedItems[Integer.parseInt (buttonView.getTag())] = isChecked;
于 2013-03-27T23:01:05.840 回答