【问题标题】:Select All items of a ListView (custom row with checkbox in it)选择 ListView 的所有项目(其中包含复选框的自定义行)
【发布时间】:2011-02-09 07:59:06
【问题描述】:

我有什么:我有一个带有自定义行的 ListView,每行有一个 CheckBox 和两个 TextView。我有一个“全选”按钮。

我想要什么:我希望当我单击按钮时,ListView 中的所有 CheckBox 都被选中/取消选中。

什么问题:在OnClick的“全选”按钮。我正在这样做:

public void OnClickSelectAllButton(View view)
{
    ListView l = getListView();
    int count = l.getCount();
    for(int i=0; i<count; ++i) 
    {
       ViewGroup row = (ViewGroup)l.getChildAt(i);
       CheckBox check = (CheckBox) row.findViewById(R.id.checkBoxID);
       check.setChecked(true); // true for select all and false for unselect all etc..
    }
}

这里 l.getChildAt(i) 只给我可见的项目。当索引超出可见项时,就会出现问题。我想检查 List 中的所有 CheckBox,而不仅仅是可见的。

【问题讨论】:

标签: android android-listview


【解决方案1】:

它会发生,因为 ListView 适配器重用视图。您尝试做的方式不正确。我认为您不应该通过 listview 子项访问 listview 行。

在您的活动中引入一个变量,它将保持当前状态 (boolean checkAll)。当用户按下按钮时,它必须将“checkAll”设置为 true,并在 ListView 的适配器上调用notifyDataSetChanged()(用于arrayadapter)或requery()(用于cursoradapter)。在适配器的getView() 方法中引入了对该标志的检查,所以if (checkAll) {check the check box}

【讨论】:

    【解决方案2】:

    你看过这个Correct way to check all checkboxes in ListView?

    int count = getListAdapter().getCount();
    

    【讨论】:

      【解决方案3】:

      我认为您应该在 UI 线程之外运行这个长时间运行的任务。 当您单击 OnClickListener 中的按钮时:

      new Thread(new Runnable() {
                              @Override
                              public void run() {
                                  for (int i = 0; i < list.getAdapter().getCount(); i++) {
                                      final int position = i;
                                      mHandler.post(new Runnable() {
                                          @Override
                                          public void run() {
                                              list.setItemChecked(pos, true);  
                                          }
                                      });
                                  }
                              }
                          }).start();     
      

      在 onCreate() 中:

      this.mHandler = new Handler();
      

      列表视图中的每个项目都应该是 Checkable ,就像实现 Checkable 接口的 CheckableRelativeLayout 一样。

      【讨论】:

        猜你喜欢
        • 2021-01-24
        • 2013-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多