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

发布于 2024-10-22 04:44:16 字数 1619 浏览 2 评论 0原文

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

正如此处所建议的,我尝试了

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

谢谢

I'm trying to do an "Unselect all" button in a ListActivity to unchecked all checkboxes in a ListView managed by a custom SimpleCursorAdapter.

As suggested here, I tried

In my ListActivity I have:

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

but nothing happens.

I'm wondering if this is because of my custom row:

<?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>

which makes mListView.setItemChecked() not find the checkbox.

How can I uncheck all cb and refresh all the rows from a button in my ListActivity?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

跨年 2024-10-29 04:44:16

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

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

}

将您的列表对象传递给它。只是避免非常长和复杂的列表。

I'm using a dirty but easy trick:

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

}

Pass your list object to it. Just avoid really long and complicated lists.

空城缀染半城烟沙 2024-10-29 04:44:16

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

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

Honestly I don't think the setChecked Methods will work with a custom layout. It expects the view to be a CheckedTextView with an id of text1.

And since the views are recycled I think the solution is to update whatever boolean in your objects in the list that determines if the checkbox is checked and then call adapter.notifyDataSetChanged(). You are changing the boolean state of the data (which is what really matters) and telling the Adapter to update the ListView. So the next time the views are drawn the checkbox will be checked correctly. And the current views that are shown will be redrawn.

执妄 2024-10-29 04:44:16

这对我有用:

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

This worked for me:

    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();
孤千羽 2024-10-29 04:44:16

我用

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

I use

checkbox.setChecked(false);
checkbox.refreshDrawableState();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文