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

时间:2011-03-15 12:59:50

标签: android listview adapter

我正在尝试在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中按钮的所有行?

由于

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

我正在使用肮脏但容易的伎俩:

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

}

将列表对象传递给它。只要避免真正冗长而复杂的列表。

答案 2 :(得分: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();

答案 3 :(得分:-1)

我用

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