【问题标题】:Uncheck all checkboxes in a custom ListView取消选中自定义 ListView 中的所有复选框
【发布时间】:2016-11-12 13:05:59
【问题描述】:

我正在尝试在 ListActivity 中执行“取消全选”按钮,以取消选中由自定义 SimpleCursorAdapter 管理的 ListView 中的所有复选框。

按照here的建议,我试过了

在我的 ListActivity 中,我有:

Button bt_f_unsel = (Button) findViewById(R.id.btn_f_unsel);
bt_f_unsel.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {           
        for ( int i=0; i< getListAdapter().getCount(); i++ ) {
            mListView.setItemChecked(i, false);
        }
    }         
});        

但什么也没发生。

我想知道这是否是因为我的自定义行:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/contact_pic"
        android:layout_width="50dp"
        android:layout_height="50dp" />

    <TextView
        android:id="@+id/contact_name"        
        android:textSize="10sp"
        android:singleLine="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <CheckBox
        android:id="@+id/checkbox"
        android:button="@drawable/whipem_cb"
        android:layout_alignParentRight="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

这使得 mListView.setItemChecked() 找不到复选框。

如何取消选中所有 cb 并刷新 ListActivity 中按钮的所有行?

谢谢

【问题讨论】:

    标签: android listview adapter


    【解决方案1】:

    我正在使用一个肮脏但简单的技巧:

    //recursive blind checks removal for everything inside a View
    private void removeAllChecks(ViewGroup vg) {
        View v = null;
        for(int i = 0; i < vg.getChildCount(); i++){
            try {
                v = vg.getChildAt(i);
                ((CheckBox)v).setChecked(false);
            }
            catch(Exception e1){ //if not checkBox, null View, etc
                try {
                    removeAllChecks((ViewGroup)v);
                }
                catch(Exception e2){ //v is not a view group
                    continue;
                }
            }
        }
    
    }
    

    将您的列表对象传递给它。只需避免冗长而复杂的列表即可。

    【讨论】:

    • 如果我们有超过 100 个项目我该怎么办?它只清除可见项目而不是其他项目?
    • 如果这真的是 ListActivity 它甚至可以工作 5000。
    • 你能建议在 removeallchecks 中传递什么吗?调用此方法时
    • 传递包含所有复选框的视图组容器(例如列表视图)。或者先在您的列表周围创建一个新列表。
    【解决方案2】:

    老实说,我认为 setChecked 方法不适用于自定义布局。它期望视图是一个带有 text1 id 的 CheckedTextView。

    由于视图被回收,我认为解决方案是更新列表中对象中确定是否选中复选框的任何布尔值,然后调用adapter.notifyDataSetChanged()。您正在更改数据的布尔状态(这才是真正重要的)并告诉适配器更新 ListView。所以下次绘制视图时,复选框将被正确选中。并且当前显示的视图将被重绘。

    【讨论】:

      【解决方案3】:

      这对我有用:

          MenuViewAdapter adapter = new MenuViewAdapter(this, menuViews,this);
      ListView lv = (ListView)this.findViewById(R.id.menu_list);
      
      
      CheckBox cb;
      
      for(int i=0; i<lv.getChildCount();i++)
      {
          cb = (CheckBox)lv.getChildAt(i).findViewById(R.id.checkBox);
          cb.setChecked(false);
      }
      adapter.notifyDataSetChanged();
      

      【讨论】:

      • 使用此代码,如果我有超过 100 个项目,我只能取消选中可见复选框。您是否尝试过取消选中列表的第一项和最后一项?
      • 这将取消选中列表中的所有复选框
      • 我做了同样的伎俩,但无法取消选中所有复选框。我只取消选中可见项目。但是当我向下滚动列表时,某些复选框未被选中
      【解决方案4】:

      我用

      checkbox.setChecked(false);
      checkbox.refreshDrawableState();
      

      【讨论】:

      • 嗨,欢迎来到 Stack Overflow。如果您突出显示代码并单击{} 按钮,它将自动为您突出显示。
      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2015-06-27
      • 2011-06-15
      相关资源
      最近更新 更多