Android 自定义列表适配器-选择所有复选框按钮

Android 自定义列表适配器-选择所有复选框按钮,android,listview,checkbox,Android,Listview,Checkbox,我已经实现了一个带有复选框的自定义Listview。用户可以点击listview上的一行,复选框将选中。即使用户滚动,也会存储位置 listview绑定到异步任务的onPostExecute中的适配器 protected void onPostExecute(Boolean result) { ImageAdapter adapter = new ImageAdapter(this, pix, paths); lstView.setAdapter(a

我已经实现了一个带有复选框的自定义Listview。用户可以点击listview上的一行,复选框将选中。即使用户滚动,也会存储位置

listview绑定到异步任务的
onPostExecute
中的适配器

 protected void onPostExecute(Boolean result) {
           ImageAdapter adapter = new ImageAdapter(this, pix, paths);
           lstView.setAdapter(adapter);
        }
我可以单击列表项并选中该项的复选框,如下所示:

lstView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long row) {

CheckBox cb = (CheckBox) view.findViewById(R.id.checkBox1);
                        cb.performClick();
}
lstView.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图视图、整型位置、长行){
复选框cb=(复选框)view.findViewById(R.id.checkBox1);
cb.performClick();
}
我想介绍一个按钮,它将选中所有复选框

我试过了,但不起作用

mSelectAllButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);//find the checkbox in the custom list

                    int cntChoice = mListView.getCount();
                    for(int i = 0; i < cntChoice; i++)
                    {
                        //if the checkbox is not clicked then click it
                        if(!mListView.isItemChecked(i))

                            {
                                //cb.performClick(); // didnt work

                                //cb.setChecked(true); // didnt work
                            }
                    }
mSelectAllButton.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
复选框cb=(CheckBox)v.findviewbyd(R.id.checkBox1);//在自定义列表中查找该复选框
int cntChoice=mListView.getCount();
for(int i=0;i
有谁能给我解释清楚(我是Android和Java新手)如何更改我的适配器,以及如何在我的主要活动的OnClick侦听器中实现这一点

我是否必须为此创建新的ImageAdapter并将其重新绑定到ListView

谢谢

我的适配器:

public class ImageAdapter extends BaseAdapter {
    Context context;
    ArrayList<Bitmap> images;
    ArrayList folderName;
    boolean[] checkBoxState;


    public ImageAdapter(Context c, ArrayList<Bitmap> images, ArrayList folderName){
        this.context = c;
        this.images = images;
        this.folderName = folderName;
        this.context = context;

        checkBoxState=new boolean[images.size()];
        imageLoader = ImageLoader.getInstance();

    }


    public int getCount() {
        return images.size();
    }


    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return 0;
    }

    private class ViewHolder {
        TextView title;
        ImageView iconImage;
        CheckBox checkbox;
    }

 public View getView(final int position, View arg1, ViewGroup arg2) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View v = arg1;
        ViewHolder holder;

    if (arg1 == null) {
        LayoutInflater vi = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.list_row, null);

        holder = new ViewHolder();
        holder.title = (TextView) v.findViewById(R.id.filename);
         holder.iconImage = (ImageView) v.findViewById(R.id.list_image);
        holder.checkbox = (CheckBox)v.findViewById(R.id.checkBox1);

        v.setTag(holder);
    } else {
        holder = (ViewHolder) v.getTag();
    }
    int i = folderName.get(position).toString().lastIndexOf('\\');
    if(i!= -1)
    {
    holder.title.setText(folderName.get(position).toString().substring(i));
    }
    else
    {
        holder.title.setText(folderName.get(position).toString());
    }

    holder.iconImage.setImageBitmap(images.get(position));
    holder.checkbox.setChecked(checkBoxState[position]);
    holder.checkbox.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            if(((CheckBox)v).isChecked())
                checkBoxState[position]=true;
            else
                checkBoxState[position]=false;

        }
    });

        return v;
公共类ImageAdapter扩展了BaseAdapter{
语境;
阵列图像;
ArrayList folderName;
布尔[]checkBoxState;
公共ImageAdapter(上下文c、ArrayList图像、ArrayList文件夹名){
this.context=c;
这个。图像=图像;
this.folderName=folderName;
this.context=上下文;
checkBoxState=new boolean[images.size()];
imageLoader=imageLoader.getInstance();
}
public int getCount(){
返回图像。size();
}
公共对象getItem(int arg0){
//TODO自动生成的方法存根
返回null;
}
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回0;
}
私有类视窗持有者{
文本视图标题;
图像视图图像;
复选框;
}
公共视图getView(最终整数位置,视图arg1,视图组arg2){
LayoutFlater充气器=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
视图v=arg1;
视窗座;
如果(arg1==null){
LayoutInflater vi=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
v=vi.充气(R.布局.列表,空);
holder=新的ViewHolder();
holder.title=(TextView)v.findViewById(R.id.filename);
holder.iconImage=(ImageView)v.findViewById(R.id.list\u图像);
holder.checkbox=(checkbox)v.findViewById(R.id.checkBox1);
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
int i=folderName.get(position.toString().lastIndexOf('\\');
如果(i!=-1)
{
holder.title.setText(folderName.get(position.toString().substring(i));
}
其他的
{
holder.title.setText(folderName.get(position.toString());
}
holder.iconImage.setImageBitmap(images.get(position));
holder.checkbox.setChecked(checkbox状态[位置]);
holder.checkbox.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
如果(((复选框)v).isChecked())
checkBoxState[位置]=真;
其他的
checkBoxState[位置]=假;
}
});
返回v;

首先,您需要向ViewHolder添加一个以上的参数

int id 
下面是您的
getView()
方法的更新

public View getView(final int position, View arg1, ViewGroup arg2) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View v = arg1;
        final ViewHolder holder;

        if (arg1 == null) {
            LayoutInflater vi = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.list_row, null);

            holder = new ViewHolder();
            holder.title = (TextView) v.findViewById(R.id.filename);
            holder.iconImage = (ImageView) v.findViewById(R.id.list_image);
            holder.checkbox = (CheckBox) v.findViewById(R.id.checkBox1);

            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }
        holder.id = position;
        int i = folderName.get(position).toString().lastIndexOf('\\');
        if (i != -1) {
            holder.title.setText(folderName.get(position).toString()
                    .substring(i));
        } else {
            holder.title.setText(folderName.get(position).toString());
        }

        holder.iconImage.setImageBitmap(images.get(position));
        holder.checkbox.setChecked(checkBoxState[position]);
        holder.checkbox
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton arg0,
                            boolean isCheck) {
                        if (isCheck)
                            checkBoxState[holder.id] = true;
                        else
                            checkBoxState[holder.id] = false;
                        notifyDataSetChange();
                    }
                });

        return v;
    }

请尽快告诉我结果

首先,您需要将
ImageAdapter
声明为全局变量

其次,您在应用程序中使用了适配器

protected void onPostExecute(Boolean result) {
           adapter = new ImageAdapter(this, pix, paths);
           lstView.setAdapter(adapter);
        }
第三,在ImageAdapter类中再添加一个方法

public void selectedAll() {
    for(int i = 0; i< checkBoxState.length; i++){
       checkBoxState[i] = true;
    }
    notifyDataSetChanged();
}

试试这个——我已经看到了,但我不明白(当他们谈论模型的时候)当然我可以解释。首先你能发布你的代码吗,folderName和images?它们只是数组。folderName是一个字符串ArrayList,用于填充textview。images是一个位图ArrayList,用于填充自定义列表中的ImageView。它们建立在一个doInBackground异步任务中,并传递给onPostExecute。好的。现在呢您需要创建一个模型类(也称为POJO),它可能包含三个变量(字符串标题、位图和isChecked)。然后创建getter和setter方法。在此之后,更改将数组设置为使用新创建的setter方法的代码,并在getView中使用getter获取这些方法。如果您不清楚,请参阅一些教程。发布此文章,我们可以继续实际需求。感谢您的回复-我需要什么代码“全选”按钮,以便将所有复选框标记为选中?啊。您只需将checkBoxState数组的所有值设置为true。然后调用notifyDataSetChange()什么是checkBoxState数组?您能提供一个示例吗?我的适配器位于不同的java文件中,该文件是代码checkBoxState中的值。很抱歉,我不知道它在哪里。谢谢,这更有意义-我应该在image adapter类中的何处添加selectedAll()方法,它是否需要进入GetView()中,或其外部?selectedAll()需要添加站点Getview()。您有
if(adapter != null)
    adapter.selectedAll();