Android 为什么在我向上滚动网格视图后复选框变为不选中?

Android 为什么在我向上滚动网格视图后复选框变为不选中?,android,gridview,checkbox,Android,Gridview,Checkbox,我创建了一个包含图像视图和复选框的网格视图,并在该网格视图中扩展了我的复选框和图像视图。如果选中我的复选框,然后向下/向上滚动网格视图,则已选中网格的复选框将变为取消选中。 我的代码有什么问题 public class ImageAdapter extends BaseAdapter { private LayoutInflater mInflater; private Context context; public ImageAdapter(Context c, boo

我创建了一个包含图像视图和复选框的网格视图,并在该网格视图中扩展了我的复选框和图像视图。如果选中我的复选框,然后向下/向上滚动网格视图,则已选中网格的复选框将变为取消选中。 我的代码有什么问题

public class ImageAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    private Context context;
    public ImageAdapter(Context c, boolean checkAll) {
        context = c;
        isCheckAll = checkAll;
    }

    public int getCount() {
        return count;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(
                    R.layout.a_6th_main_checkbox, null);


            holder.imageview = (ImageView) convertView.findViewById(R.id.img_thumbImage);
            holder.checkbox = (CheckBox) convertView.findViewById(R.id.cbo_CheckImage);

            convertView.setTag(holder);
        }
        else {
            holder = (ViewHolder) convertView.getTag();

        }


        holder.checkbox.setId(position);
        holder.imageview.setId(position);

        holder.checkbox.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub

                CheckBox cb = (CheckBox) v;
                int id = cb.getId();

                if(cb.isChecked()){
                    cb.setChecked(true);
                    thumbnailsselection[id] = true;

                }
                else if (!cb.isChecked()){
                    cb.setChecked(false);
                    thumbnailsselection[id] = false;
                }

            }
        });
        final int id = holder.checkbox.getId();
        holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub

                CheckBox check = (CheckBox) buttonView;

                if(buttonView.isChecked() == isChecked){

                    thumbnailsselection[id] = true;

                }
                else {
                    thumbnailsselection[id] = false;
                }
            }
        });
        holder.imageview.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                int id = v.getId();
                Intent intent = new Intent();
                intent.setAction(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.parse("file://" + arrPath[id]), "image/*");
                startActivity(intent);

            }
        });
        holder.imageview.setImageBitmap(thumbnails[position]);
        if (!isCheckAll){
            holder.checkbox.setChecked(false);
        }else{
            holder.checkbox.setChecked(true);

        }

        holder.id = position;
        return convertView;
    }
}
class ViewHolder {
    CheckBox checkbox, cbo_SelectAll;
    ImageView imageview;
    int id;
}
}

holder.checkbox.setId(位置)之后

您应该添加:

holder.checkbox.setChecked(thumbnailsselection[id]);

仅当convertview为空时,才设置复选框的标记。这只在第一屏记录中发生。当用户向下滚动时,将回收以前的视图。因此,您的复选框将旧数据项作为其标记

选中的更改侦听器应如下所示:

new CompoundButton.OnCheckedChangeListener()
{
   @Override
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)
    {
    Person element = (Person) viewHolder.checkBox.getTag();

    data[position].setCheck(isChecked);

    if(isChecked)
    {
        // do your stuff
    }
    else
    {
        //to-do
    }

}
}


堂“不要使用onCheckedChanged,而是使用onClick,这对我来说很有效。

这不起作用,每次我向上滚动网格视图时,选中的复选框会转到顶部,在向下滚动后会变为不选中again@NewDroidDev尝试我发布的链接,它可以根据您的要求进行修改。我遵循源代码@,这里是sameple ok,问题是isCheckAll,在getView的末尾,使用if(isCheckAll)设置holder.cb已选中。类似的问题。试试这个