【问题标题】:Correct way to check all checkboxes in ListView?检查ListView中所有复选框的正确方法?
【发布时间】:2011-02-02 15:11:47
【问题描述】:

我有一个设置了 CHOICE_MODE_MULTIPLE 的 ListView。我还有额外的标题要管理 (取消)选择所有项目。问题是:这样做是否正确?好吧,它可以工作,但是我不确定那是正确的方法。正如您在下面看到的,有一个 checkAllCheckBoxes 我传递给标题 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);
            }
        }
    }

};

【问题讨论】:

  • 谢谢大家的回复,好点子。好吧,我也想知道也许最好将该侦听器添加到列表视图而不是仅在标题上,好像所有项目都被选中并且我从中间取消选择一个,标题仍然被选中并且看起来不太好

标签: android android-listview


【解决方案1】:

你可以像这样优化你的代码:

替换

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);
    }
}

通过

    boolean check = lv.isItemChecked(0);
    for(int i = 0; i <= size; i++)
        lv.setItemChecked(i, !check);

【讨论】:

    【解决方案2】:

    这应该做同样的事情,而且更简洁一点。循环从 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);
            }
        }
    
    };
    

    【讨论】:

    • 我不确定这是否正确。在他的代码中,当 lv.isItemChecked(0) 返回 true 时,他使用 setItemChecked(i, false) 所以布尔值是相反的。从 1 开始也不会反转第一个值。
    【解决方案3】:

    其中Length是数组中的数组长度,chkbox是全选复选框。

    chkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @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);
                    }
    
    
                }
    
            }
        });
    

    【讨论】:

      【解决方案4】:

      Robby 的解决方案对我有用。因为我必须对此进行补充。 adapter也需要更新,否则滚动列表时checkbox会恢复。

      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
              }
          }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 2020-07-06
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        • 2020-03-29
        相关资源
        最近更新 更多