android中ListView下多个CheckBox全选问题,如果CheckBox的个数超过一屏,则会出现部分被选中,部分未被选中的问题,请问高手如何解决?

解决方案 »

  1.   

    在一个group里面也会出这个问题?
      

  2.   

    checkbox的多少是根据数据库中数据的记录多少来自动生成的。在不重写Adapter的情况下是否可以解决这个问题?
      

  3.   

    还没有遇到全屏CheckBox的  完了试试看
      

  4.   

    把你的全选反选的代码贴上来看看吧
    主要是看Adapter里怎么处理最笨的办法:用ListView实例的方法去找到子的checkbox实例,然后挨个置上,应该没问题的
      

  5.   

    需要自定义ListView的MyAdapter/*
     * 自定义ListView的MyAdapter
     */
    public final class ViewHolder {
    public TextView iid;
    public EditText info;
    public CheckBox cbx;
    public ImageView img; } Set<Object> selectedSet = new HashSet<Object>();  //重点 public class MyAdapter extends BaseAdapter { private LayoutInflater mInflater; public MyAdapter(Context context) {
    this.mInflater = LayoutInflater.from(context);
    } @Override
    public int getCount() {
    return mData.size();
    } @Override
    public Object getItem(int position) {
    return mData.get(position);
    } @Override
    public long getItemId(int arg0) {
    return arg0;
    } @Override
    public View getView(final int position, View convertView,
    ViewGroup parent) { ViewHolder holder = null;
    if (convertView == null) { holder = new ViewHolder(); convertView = mInflater.inflate(R.layout.list, null);
    holder.iid = (TextView) convertView.findViewById(R.id.iid);
    holder.info = (EditText) convertView.findViewById(R.id.info); holder.cbx = (CheckBox) convertView.findViewById(R.id.cbx); holder.img = (ImageView) convertView.findViewById(R.id.img);
    convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag();
    } holder.iid.setText(String.valueOf(mData.get(position).get("iid")));
    holder.info.setText((String) mData.get(position).get("info")); int resid = (Integer) mData.get(position).get("img");
    if (resid != 0)
    holder.img.setBackgroundResource(resid);                        holder.info.setText(mData.get(position).toString());                        //重点开始
    Object b = (Object) getItem(position);
    if (b != null) {
    if (selectedSet.contains(b)) {
    holder.cbx.setChecked(true);
    } else {
    holder.cbx.setChecked(false);
    } }
    holder.cbx.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    CheckBox cb = (CheckBox) v;
    if (cb.isChecked()) {
    selectedSet.add((Object) getItem(position));
    } else {
    selectedSet.remove((Object) getItem(position));
    }
    }
    });
                            //重点结束
    holder.info.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
    }
    }); return convertView;
    } @Override
    public void notifyDataSetChanged() {
    // TODO Auto-generated method stub
    super.notifyDataSetChanged();
    }
    }不懂的可以问我
      

  6.   

    我知道重写Adapter,我也实现了功能。只有这种解决方法吗?
      

  7.   

    http://download.csdn.net/source/3120614这就是你要的
      

  8.   

    下面是我以前看的一个例子,这个应该能解决你的问题吧:
    package com.listViewTest;import java.util.ArrayList;
    import java.util.List;
    import android.app.ListActivity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.CheckBox;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.TextView;public class ListViewTest extends ListActivity {
    /** Called when the activity is first created. */  
        Context context = null;   
        List<Integer> list = new ArrayList<Integer>();
        CheckBox checkbox;
    private LinearLayout lr;
        
        @Override  
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            setContentView(R.layout.main);   
            context = getApplicationContext();   
            setListAdapter(new MyListAdapter());   
        }   
        
        @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    // TODO Auto-generated method stub
    super.onListItemClick(l, v, position, id);
    lr = (LinearLayout) v;
    checkbox = (CheckBox) lr.getChildAt(1);
    if (list.contains(new Integer(position))) {
    checkbox.setChecked(false);
    list.remove(new Integer(position));
    }else {
    checkbox.setChecked(true);
    list.add(new Integer(position));
    }
    }
        
    class MyListAdapter extends BaseAdapter{   
            String data[] = new String[]{"apple", "pear", "banana", "orange","apple", "pear", "banana", "orange","apple", "pear", "banana", "orange"};   
            public int getCount() {   
                // TODO Auto-generated method stub   
                return data.length;   
            }   
      
            public Object getItem(int position) {   
                // TODO Auto-generated method stub   
                return data[position];   
            }   
      
            public long getItemId(int position) {   
                // TODO Auto-generated method stub   
                return position;   
            }   
      
            public View getView(int position, View convertView, ViewGroup parent) {   
                if (null == convertView){   
                    LayoutInflater inflater      = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);   
                    convertView = inflater.inflate(R.layout.list_item, parent, false);   
                }   
                TextView text       =   (TextView)convertView.findViewById(R.id.info);   
                checkbox   =   (CheckBox)convertView.findViewById(R.id.checkstatus);   
                checkbox.setTag(new Integer(position));   
                text.setText(data[position]);   
                if (list != null) {
                 checkbox.setChecked((list.contains(new Integer(position)))); 
    } else {
    checkbox.setChecked(false);   
    }
                return convertView;   
            }   
        }  
    }