Android 在ListView中选中所有复选框的正确方法?

Android 在ListView中选中所有复选框的正确方法?,android,android-listview,Android,Android Listview,我有一个列表视图,设置了选项\模式\多个。我还需要管理其他标题 (un)选择所有项目。问题是:这样做正确吗?嗯,这是可行的,但我不确定这是正确的方法。正如您在下面看到的,这里有一个复选框AllCheckBox 对象,我将其传递给header onClickListener()方法。你怎么认为?如有任何答复,将不胜感激 private OnClickListener checkAllCheckboxes = new OnClickListener(){ public void onClic

我有一个列表视图,设置了选项\模式\多个。我还需要管理其他标题 (un)选择所有项目。问题是:这样做正确吗?嗯,这是可行的,但我不确定这是正确的方法。正如您在下面看到的,这里有一个复选框AllCheckBox 对象,我将其传递给header onClickListener()方法。你怎么认为?如有任何答复,将不胜感激

private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = getListAdapter().getCount();
        if(lv.isItemChecked(0)){
            for(int i = 0; i<=size; i++){
                lv.setItemChecked(i, false);
            }
        } else {
            for(int i = 0; i<=size; i++){
                lv.setItemChecked(i, true);
            }
        }
    }

};
private OnClickListener checkallcheckbox=new OnClickListener(){
公共void onClick(视图v){
ListView lv=getListView();
int size=getListAdapter().getCount();
如果(I级检查(0)){

对于(int i=0;i您可以像这样优化代码:

替换

if(lv.isItemChecked(0)){
    for(int i = 0; i<=size; i++){
        lv.setItemChecked(i, false);
    }
} else {
    for(int i = 0; i<=size; i++){
        lv.setItemChecked(i, true);
    }
}
if(lv.isItemChecked(0)){

对于(int i=0;i这应该做同样的事情,并且更加简洁。循环从1开始,因为您不想重置标头的选中状态,标头是索引0

private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = lv.getAdapter().getCount();
        boolean checked = lv.isItemChecked(0);
        for(int i=1; i<size; i++) {
          lv.setItemChecked(i, checked);
        }
    }

};
private OnClickListener checkallcheckbox=new OnClickListener(){
公共void onClick(视图v){
ListView lv=getListView();
int size=lv.getAdapter().getCount();
选中布尔值=lv.isItemChecked(0);

对于(int i=1;i,其中Length是数组中的数组长度,chkbox是select all复选框

setOnCheckedChangeListener(新的OnCheckedChangeListener(){

@覆盖
检查更改后的公共无效(复合按钮视图,布尔值已检查){
//TODO自动生成的方法存根
if(chkbox.isChecked())
{

对于(i=0;iRobby的解决方案对我有效。因为我必须在其中添加一项。
适配器
更新也是必需的,否则当您滚动列表时,
复选框
将恢复

private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = lv.getAdapter().getCount();
        boolean checked = lv.isItemChecked(0);
        for(int i=1; i<size; i++) {
          lv.setItemChecked(i, checked);

           CustomListItem it = CustomAdapter.get(i);
           it.setChk(check); // set value in adapter
        }
    }
};
private OnClickListener checkallcheckbox=new OnClickListener(){
公共void onClick(视图v){
ListView lv=getListView();
int size=lv.getAdapter().getCount();
选中布尔值=lv.isItemChecked(0);

对于(inti=1;我不确定这是否正确。在他的代码中,当lv.isItemChecked(0)返回true时,他使用setItemChecked(i,false)所以布尔值是反向的。从1开始也不会反向第一个值。感谢各位的响应,好的观点。我还想知道,也许最好将该侦听器添加到listview,而不是仅在标题上,好像所有项目都被选中,而我从中间取消选择一个,标题仍然被选中,看起来不像我们看到的那样陆上通信线
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            if(chkbox.isChecked())
            {

                for(i=0;i<length;i++)
                {

                                    lv.setItemChecked(i, true);
                }

            }
            else
            {
                for(i=0;i<length;i++)
                {

                                    lv.setItemChecked(i, false);
                }


            }

        }
    });
private OnClickListener checkAllCheckboxes = new OnClickListener(){
    public void onClick(View v) {
        ListView lv = getListView();
        int size = lv.getAdapter().getCount();
        boolean checked = lv.isItemChecked(0);
        for(int i=1; i<size; i++) {
          lv.setItemChecked(i, checked);

           CustomListItem it = CustomAdapter.get(i);
           it.setChk(check); // set value in adapter
        }
    }
};