本帖最后由 hyrichard 于 2010-07-23 17:49:18 编辑

解决方案 »

  1.   

    你应该根据onItemClick中的view来获得对应的CheckBox
      

  2.   

    通过view的getparent和getchild方法来获取到对应的CheckBox
      

  3.   

    看了下楼主的布局,想不明白你那样布局是为什么?感觉你的布局有点问题。建议都用LinearLayout。
      

  4.   

    http://linux.chinaunix.net/bbs/forum-70-1.html
      

  5.   

    android.R.layout.simple_list_item_multiple_choice
    加上
    ListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE)可以实现列表复选
      

  6.   

    我自己重写了下adapter 然后跟踪了下getView()这个函数。发现一个问题就是,我每次点击某一项的时候,它都要通过getView()对画面进行更新。然后我看了下网上其它人写的一些adapter,里面都有个类似viewholder的东西。不明白是干啥子用的。还有就是没搞清楚一个问题,我在getView()里面Log.D一下。发现初始化的时候要调用getView()这个函数3*项数这么多次。然后每次点击其中某项 会调用2*项数这么多次。没搞懂。因为我如果捕获这个消息以后对checkbox进行处理。但是我处理完这个消息以后系统会对布局进行从新布局。。而且默认的simpleadapter貌似动态生成的checkbox的ID都一样的。所以通过getviewbyid()这个方法来处理的话 貌似会问题。不过我现在还没搞清楚问题出在什么地方。
      

  7.   

    我也出现同样的问题,不过我用的是ExpandableListView,求解
      

  8.   

    <CheckBox 
    android:text="zhao" 
    android:id="@+id/zhao_cb" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </CheckBox>
    <CheckBox 
    android:text="qian"
     android:id="@+id/qian_cb" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content">
     </CheckBox>
    <CheckBox android:text="song" 
    android:id="@+id/song_cb" 
    android:layout_width="wrap_content"
     android:layout_height="wrap_content">
     </CheckBox>
    <CheckBox 
    android:text="li" 
    android:id="@+id/li_cb" 
    android:layout_width="wrap_content"
     android:layout_height="wrap_content">
     </CheckBox>
     
    <Button 
    android:text="获取checkbox的值" 
    android:id="@+id/get_view_button" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content">
    </Button>
    </LinearLayout>
      

  9.   

    ListView中并不是有多少个Item就有多少个childView,如果你的手机能完整显示7个Item,则当前的ListView只有8个ChildView,什么意思呢?
    就是说getChildAt(0)和getChildAt(8)其实获取到的是同一个childView,所以上面的checkBox当然是同一个checkBox,所以当你把第一个Item的CheckBox勾上时,第9个Item的CheckBox也被勾上了,在来回滑动的过程中,可能顺序就乱了,就不遵循这个规律了。
    明白了吧,呼呼。我的手机当前能完整显示9个Item,看看Log,inview是onListItemClick的第2个参数:
    01-01 02:54:58.053: DEBUG/List_CheckBox(4741): onListItemClick, pos=0
    01-01 02:54:58.055: DEBUG/List_CheckBox(4741): onListItemClick, id=0
    01-01 02:54:58.057: DEBUG/List_CheckBox(4741): onListItemClick, inview=android.widget.RelativeLayout@43958190
    01-01 02:54:58.059: DEBUG/List_CheckBox(4741): onListItemClick, child=android.widget.RelativeLayout@4395819001-01 02:55:03.667: DEBUG/List_CheckBox(4741): onListItemClick, pos=10
    01-01 02:55:03.673: DEBUG/List_CheckBox(4741): onListItemClick, id=10
    01-01 02:55:03.677: DEBUG/List_CheckBox(4741): onListItemClick, inview=android.widget.RelativeLayout@43958190
    01-01 02:55:03.685: DEBUG/List_CheckBox(4741): onListItemClick, child=null看到了吧,被点击的是同一个view,而getChildAt(10) is NULL,所以楼主那个List往下滑时难道没报空指针异常?要想达到楼主需要的效果,有一种方法是自定义Adapter,在onListItemClick被点击时记录被点击的positon,然后getView时判断当前的position与记录的position是否匹配,匹配则checked。
    对了,最好给CheckBox加上两个属性:
        android:clickable="false"
        android:focusable="false"
    不然点击时不会触发onListItemClick(); 如果你的需求是点击Item就Check上,再给CheckBox加上android:clickable="false",这样就可以只在onListItemClick()中处理事件,而不用管CheckBox自身的变化了。
      

  10.   

    说错了,如果只能显示7项,getChildAt(8)返回的应该是null.
      

  11.   

    已经很久前的帖子了,自己也碰到这个问题,
    lmdy2001  说得对,adapter中添加一个记录每个checkbox是否被选中的map,然后在getview里面获取view的时候,判断一下,返回过去就可以了
      

  12.   

    遇到相同的问题,不知道能否把写的adapter的代码发给我看一下,谢谢![email protected]