如题,就是listview中每一行都有一个checkbox,我想当点击一个按钮时,
把所有checkbox被选中的行的相应数据从数据库中删除,
可是不知道如何能获得checkbox的状态。
谢谢!!

解决方案 »

  1.   

    定义一个数组映射这个listview
    通过这个数组的值来获取状态
      

  2.   


        CheckBox cb;//全局变量
        public class ListAdapter extends ArrayAdapter<Group>{
    int resource;
    public ListAdapter(Context context, int _resource, 
                                       List textViewResourceId) {
    super(context, _resource, textViewResourceId);
    // TODO Auto-generated constructor stub
    resource = _resource;
    }
     @Override
         public View getView(int position, View convertView, ViewGroup parent){
     RelativeLayout layout;
     if(convertView == null){
    layout = new LinearLayout(getContext());
             String inflater = Context.LAYOUT_INFLATER_SERVICE;
             LayoutInflater li = 
                                       (LayoutInflater) getContext().getSystemService(inflater);
             li.inflate(resource, layout, true);
            }else{
             layout = (RelativeLayout) convertView;
            }
            cb = (CheckBox)layout.findViewById(R.id.add_group_name);       
            return layout;
        }
    }   private OnClickListener bottonListener = new OnClickListener(){
           public void onClick(View v) {
               //对cb操作,数据库操作
            }
       }
      

  3.   

    本人愚钝,初学android,还是不大明白。
    请问对“对cb操作”怎么写代码呢?遍历listview中每行的checkbox查看状态?
    不甚感激!
      

  4.   


        ArrayList<CheckBox> cbs = new ArrayList<CheckBox>();
        //自定义内部类
        public class ListAdapter extends ArrayAdapter{
            int resource;
            public ListAdapter(Context context, int _resource, 
                                       List textViewResourceId) {
                super(context, _resource, textViewResourceId);
                // TODO Auto-generated constructor stub
                resource = _resource;
            }
             @Override
             public View getView(int position, View convertView, ViewGroup parent){
                 RelativeLayout layout;
                 if(convertView == null){
                    layout = new LinearLayout(getContext());
                        String inflater = Context.LAYOUT_INFLATER_SERVICE;
                        LayoutInflater li = 
                                       (LayoutInflater) getContext().getSystemService(inflater);
                        li.inflate(resource, layout, true);
                   }else{
                    layout = (RelativeLayout) convertView;
                   }
                CheckBox cb = (CheckBox)layout.findViewById(R.id.checkbox);       
                return layout;
            }
        }
        
       public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ListView lv = (ListView)findViewById(R.id.list_view);
            ListAdapter la = new ListAdapter(MyGroupManage.this,R.layout.group_list,lg);
            lv.setAdapter(la);
            Button b = (Button)findViewById(R.id.button);
            b.setOnClickListener(buttonListener)
       }       private OnClickListener buttonListener = new OnClickListener(){
           public void onClick(View v) {
               //对cbs操作,数据库操作
               for(int i=0;i<cbs.size();i++){
             String data = cbs.get(i).getText().toString();
             //数据库再对这个data操作,删掉你想要的数据
               }
            }
       }
      

  5.   

    ListAdapter la = new ListAdapter(MyGroupManage.this,R.layout.group_list,lg);
    这行没写好
    lg指的是ArrayList lg = ArrayList();有什么问题再问吧,说的不是太清楚
      

  6.   

    CheckBox cb = (CheckBox)layout.findViewById(R.id.checkbox); 下面少了
    cbs.add(cb);
      

  7.   

    明白些了,我再好好看看,先谢过AspireHouse !
      

  8.   

    不过用listView来实现对Item操作不太好,曾经遇到过很多问题,个人感觉ListView只能用来做显示
      

  9.   

    这个getView是什么时候调用啊?
    如果我继承的是CursorAdapter类,那么bindView又是什么时候调用啊?
    如果我用一个Cursor绑定到CursorAdapter上,是不是我Cursor里有几条getView和bindView就会被调用几次啊?
    真是不太明白Adapter的机制……
      

  10.   

    getView在ListView中Item在屏幕上显示时调用 而且每次显示都会调用,所以比较麻烦
      

  11.   

    我要是重写CursorAdapter的话,那么
    CheckBox cb = (CheckBox)layout.findViewById(R.id.checkbox);
    cbs.add(cb);
    是放在getView里还是放在bindView里啊?
    谢谢AspireHouse!!!
      

  12.   

    你先看看sdk自带ApiDemos的例子,工程放到虚拟机中运行试试,也没研究过CursorAdapter,我也来看看,
    C:\Program Files\android-sdk-windows-1.5_r2\platforms\android-1.5\samples\ApiDemos\src\com\example\android\apis\view
      

  13.   

    应该不用getView只用重写newView和bindView就行了
      

  14.   

    谢谢AspireHouse一直以来对我的帮助! 
      

  15.   

    我的list item也包哈一个CheckBox, 在CheckBox的OnChange事件中怎么获取list item的索引值呢?
      

  16.   

    private OnClickListener buttonListener = new OnClickListener(){
           public void onClick(View v) {
               //对cbs操作,数据库操作
               for(int i=0;i<cbs.size();i++){
                String data = cbs.get(i).getText().toString();
                //数据库再对这个data操作,删掉你想要的数据
               }
            }
    这部分的代码,要做到删除自己选中的那些CheckBox行,是否还需要作一个判断呢,如:private OnClickListener buttonListener = new OnClickListener(){
           public void onClick(View v) {
               //对cbs操作,数据库操作
              Log.v("size",Integer.toString(cbs.size()));
               for(int i=0;i<cbs.size();i++){
                if(cbs.get(i).isChecked)
                   {
                        String data = cbs.get(i).getText().toString();
                           //数据库再对这个data操作,删掉你想要的数据                  }
               }
            }
    为什么size大小不等于总的行数呢?
    急望指教
      

  17.   

    android在刷新界面时会产生对界面元素的复用,至于怎样复用,可以在newView()和getView()函数中进行打印,来跟踪系统的调用流程来帮助自己理解。
    对于listview中应用checkbox的情况,我这有一个CheckListView类,通过这个类就可以很容易的达到删除listviewitem的效果。有兴趣的,可以去我的资源里找一下,资源名叫“CheckListView”
      

  18.   

    CheckListView的资源在:http://download.csdn.net/source/2239460
      

  19.   

           delibt.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {            for(int i=0;i<cbs.size();i++){             
                if(cbs.get(i).isChecked())
                {               
                String data = cbs.get(i).getText().toString();
                db.delete("urltable", data, null);
                }
               }
    }
    });
            
            refibt.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
            query();
    }
    });
        }  
        
    //查询函数
    private void query() {

    ArrayList<String> al = new ArrayList<String>();
    Cursor c = db.query("urltable", null, null, null, null, null, null); if (c.moveToFirst()) {
    for (int i = 0; i < c.getCount(); i++) {
    c.moveToPosition(i);
    String url = c.getString(0);
    al.add(url);
    }
    }

    /*ArrayAdapter<String> adapter = new ArrayAdapter<String>(
    ClearActivity.this, android.R.layout.simple_list_item_1, al);
    lv.setAdapter(adapter);*/

    ListAdapter la = new ListAdapter(ClearActivity.this,R.layout.listview,al);
            lv.setAdapter(la);        
            
    }



    public class ListAdapter extends ArrayAdapter{ int resource;
    Context ct;

            public ListAdapter(Context context, int _resource, 
                                       List textViewResourceId) {
                super(context, _resource, textViewResourceId);
                this.resource = _resource;
                this.ct = context;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent){
                LinearLayout layout;
                if(convertView == null){
                   layout = new LinearLayout(ct);
                       String inflater = Context.LAYOUT_INFLATER_SERVICE;
                       LayoutInflater li = 
                                      (LayoutInflater) getContext().getSystemService(inflater);
                       li.inflate(resource, layout, true);
                  }else{
                   layout = (LinearLayout) convertView;
                  }
               CheckBox cb = (CheckBox)layout.findViewById(R.id.CheckBox01); 
               TextView tv = (TextView) layout.findViewById(R.id.TextView01);
               cbs.add(cb);
               textview.add(tv);
               return layout;
           }
    } 我的为什么只显示checkbox而不显示textview呢  还有选任一项都把全部内容删了
      

  20.   

    哈哈,不用重写getView()也能实现多选.
    在onItemClick()函数内执行CheckBox的动作即可.
    不过自己要做个数组保存每行的选中状态,方便批量操作.
      

  21.   

    public class ClearListActivity extends Activity {
    private ImageButton rebibt,delibt,refibt;
    private ListView lv;
    private static DBHelper helper;
    private SQLiteDatabase db;

    ArrayList<CheckBox> cbs = new ArrayList<CheckBox>();
    ArrayList<TextView> textview = new ArrayList<TextView>();

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.clear);
            helper = new DBHelper(this);
            
            rebibt = (ImageButton) findViewById(R.id.clear_reb_ImageButton01);
            delibt = (ImageButton) findViewById(R.id.clear_del_ImageButton02);
            refibt = (ImageButton) findViewById(R.id.clear_ref_ImageButton03);
            lv = (ListView) findViewById(R.id.clear_ListView01);       
           
            rebibt.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
    Intent intent = new Intent(ClearListActivity.this,
    WebListActivity.class);
    startActivity(intent);
    }
    });
            
            delibt.setOnClickListener(new OnClickListener() {

    public void onClick(View v) { //helper.delete();
               for(int i=0;i<cbs.size();i++){             
                if(cbs.get(i).isChecked())
                {               
                String data = cbs.get(i).getText().toString();             
                //String data = textview.get(i).getText().toString();            
                db.delete("urltable", data, null);
                }
               }
    }
    });
            
            refibt.setOnClickListener(new OnClickListener() {

    public void onClick(View v) {
            query();
    }
    });
        } 
        
    //查询函数
    private void query() {

    /*ArrayList<String> al = new ArrayList<String>();
    al = helper.query();*/

    ListAdapter la = new ListAdapter(ClearListActivity.this,R.layout.listview1,helper.query());
    lv.setAdapter(la);      
    }

    public class ListAdapter extends ArrayAdapter{ int resource;
    Context ct;

            public ListAdapter(Context context, int _resource, 
                                       List textViewResourceId) {
                super(context, _resource, textViewResourceId);
                this.resource = _resource;
                this.ct = context;
            }

            @Override
            public View getView(int position, View convertView, ViewGroup parent){
                LinearLayout layout;
                if(convertView == null){
                   layout = new LinearLayout(ct);
                       String inflater = Context.LAYOUT_INFLATER_SERVICE;
                       LayoutInflater li = 
                                      (LayoutInflater) getContext().getSystemService(inflater);
                       li.inflate(resource, layout, true);
                  }else{
                   layout = (LinearLayout) convertView;
                  }
               CheckBox cb = (CheckBox)layout.findViewById(R.id.lv_CheckBox01); 
               //TextView tv = (TextView) layout.findViewById(R.id.lv_TextView01);
               cbs.add(cb);
               //textview.add(tv);
               return layout;
           }
    }
    }
    好痛苦啊!我的列表内容始终显示不了,现在连删除也删不了了
      

  22.   

    引用 26 楼 cancel_li 的回复:
    哈哈,不用重写getView()也能实现多选.
    在onItemClick()函数内执行CheckBox的动作即可.
    不过自己要做个数组保存每行的选中状态,方便批量操作.
    请问能具体点吗?有代码可以发一下吗?谢谢了
      

  23.   

    checkbox=(CheckBox) mListView01.getChildAt(i).findViewById(R.id.checkbox);  
    if(endCheckbox.isChecked())
    {
    ...
    ......  
    }遍历一下显示的listview, 就可以读出listview中所有checkbox的状态。
      

  24.   

    其实listview里就有一个显示模式自带有有checkbox,你用那个就挺好的,也可以主进行判断
      

  25.   

    7楼的代码不好用String data = cbs.get(i).getText().toString();拿不到这个值
      

  26.   

    呵呵 getChildAt(i)找这个方法好久了.谢谢 o2co21985