holder.cb.setId(postion);
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    //如何获取该CheckBox所在的list item的索引,以便更新mList对应的数据;
      int index = buttonView.getId();
      mList.get(index);
    } 

解决方案 »

  1.   

    非常感谢AspireHouse,我先试试
      

  2.   

    确实可以工作,再次感谢AspireHouse可是又发现一个新问题,这个onCheckedChanged()函数在我点击CheckBox的时候触发是正常的,可是当我鼠标中键滑动list,当刚才点击过的CheckBox滑出当前view的时候,居然自动再次触发了onCheckedChanged()函数,而且传递进来的布尔参数恰好跟刚才点击触发时的参数相反,也就是说,自动把CheckBox恢复了原样。额的神,这是为什么阿
      

  3.   

    这个check box的状态时需要储存的,否则会出现乱刷新的情况。
    要么拿一个专门的list或者数组来存放,要么就直接在adapter关联的list的数据结构中加上isChecked这一项
      

  4.   

    是的 这个确实是问题  因为在listview中Item在屏幕上消失再显示的话每次都会调用getView方法
      

  5.   

    如果listview上的Item条数超过一个屏幕的话  做一些UI操作会遇到不少问题  
      

  6.   

    这个已经在mList里面做了储存,布尔值
      

  7.   

    消失再显示的时候调用getView是没有问题的,可是消失的时候CheckBox干吗要调用onCheckedChanged()呢
    ,而且传进来的参数还是相反的。值得注意的是,是在消失的时候调用的,还没有再次显示,应该跟GetView无关吧
      

  8.   


    那么你在getview加一个判断
    if(isChecked)
    {
       checkBox.setChecked(true);
    }else{
        checkBox.setChecked(false);
    }
      

  9.   

    我的getview已经有了阿,holder.cb.setChecked(mChecked); 不是等价的么
      

  10.   

    经过测试,我想我找到问题了,但还没有解决办法。应该还是getView有问题,跟有没有鼠标点击没关系。假设我的list一共有6个list item, 而一个屏幕只能显示5个,然后Android就会做5个convertView的cache,也就是说getView中的 if (convertView == null) { } 分支会连续调用5次,而最后面的第六个list item显示时的convertView会重复使用最前面的第一个,因为这时第一个已经看不见了。这算是一种优化。
    这时问题就出现了,假设第一个list item的CheckBox是false, 而第六个是true. 在显示第六个的时候就会执行getView中的holder.cb.setChecked(mChecked); (此时mChecked为true)。 别忘了这时使用的是第一个list item的convertView, 所以就触发了第一个的OnCheckedChangeListener()方法,强制将第一个设成了true这是我的理解,但我还没找到什么好的方法
      

  11.   

    有办法解决的  不用listview
      

  12.   

    LinearLayout items =  (LinearLayout)findViewById(R.id.items);//相当于listview
    int resource = R.layout.item;//每个item布局
    LayoutInflater li  = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    for(int i=0;i<6;i++){
       LinearLayout item = new LinearLayout(this);
       li.inflate(resource, item ,  true);
       CheckBox cb = (CheckBox)item.findViewById(R.id.cb);
       cb.setOnCheckedChangeListener(cbOnChange); 
       items.add(item);
    }
      

  13.   

    解决了
    holder.cb.setChecked(mChecked) 应该放到holder.cb.setId(postion) 的后面,
    再次感谢各位,尤其是AspireHouse同学:)