取消选中自定义ListView中的所有复选框

问题描述:

我试图在ListActivity中执行“取消选择所有”按钮以取消选中由自定义SimpleCursorAdapter管理的ListView中的所有复选框。取消选中自定义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中按钮的所有行?

谢谢

老实说,我不认为setChecked方法将与自定义布局一起工作。它期望该视图是一个ID为text1的CheckedTextView。

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

我使用的是肮脏的,但容易招:

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

} 

通过你的列表对象了。只需避免真正漫长而复杂的列表。

+0

如果我们有超过100个项目,我应该怎么办?它只清除其他可见项目吗? – Google 2017-03-30 12:29:10

+0

如果这真的是ListActivity它甚至可以工作5000. – halxinate 2017-04-20 18:50:05

+0

可以建议在removeallchecks中传递什么?同时调用这个方法 – Panache 2018-01-26 12:28:21

我用

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

嗨,欢迎来到Stack Overflow。如果您突出显示代码并单击“{}”按钮,它将自动为您突出显示。 – Ben 2013-08-21 21:28:08

这为我工作:

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(); 
+0

使用此代码,我可以取消选中只有可见复选框,如果我有超过100个项目。您是否尝试过取消选中列表中的第一项和最后一项? – Google 2017-03-08 11:06:17

+0

这不取消选中列表中的所有复选框 – hrushi 2017-03-28 22:55:47

+0

我做了相同的技巧,但无法取消选中所有复选框。我没有检查只有可见的项目。但是当我向下滚动列表时,某些复选框不会取消选中 – Google 2017-03-30 12:27:47