Android复选框列表视图全选(禁用/启用)

7
我想禁用/启用列表视图中的所有复选框。 事实上,我希望通过单击顶部复选框来实现全选行为。
谢谢
4个回答

27

这是最终为我工作的代码,其中我使用了一个游标适配器而不仅仅是ArrayListAdapter用于我的列表项:

final ListView list = getListView();
for ( int i=0; i< getListAdapter().getCount(); i++ ) {
        list.setItemChecked(i, true);
}

list.getChildCount无法正常工作,因为它似乎只计算了被直接绘制的内容(而非所有在屏幕外的内容),所以childCount可能只有6或8项,即使整个列表有100多项。此外,我必须使用list.setItemChecked来使项目“保持选中”——至少在我的情况下,我的列表项是CheckedTextView的实例。


我该如何处理类似这样的按钮? - Manikandan
谢谢。我遇到了麻烦,因为childCount。 - Faruk

21
for(int i=0; i < listView.getChildCount(); i++){
    RelativeLayout itemLayout = (RelativeLayout)listView.getChildAt(i);
    CheckBox cb = (CheckBox)itemLayout.findViewById(R.id.MyListViewCheckBox);
    cb.setChecked(true);
}

您需要编辑此代码以处理启用和禁用,但我希望您能理解!

另外,此代码仅检查每个复选框,请确保从列表中返回id或对象以便在其他地方发送/保存数据。


排好序了。非常感谢,Abhinav。非常感激。 - Yousuf Qureshi
1
当我勾选所有项目然后取消一个项目时,这段代码会产生一些奇怪的行为。Thom Nichols 提供的解决方案更好。 - bancer
我的listview中有按钮。当点击listview外的按钮时,我需要改变listview中所有按钮的背景。我使用了您的代码,但出现了错误。如何实现这一点。 - Manikandan
3
这只检查当前视图中的项目。因此,如果您有一个包含比视图可显示更多项目的 listView,则不会检查所有项目。Thom Nichols的答案确实是正确的解决方案。 - Roy
工作得很好 - madhu527

0

我认为你应该在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接口的CheckableRelativeLayout一样具有可选功能。


0

只需在适配器中添加一个参数即可

Boolean Ex.MyAdapter adapter = new Save_Weight_Adapter(this, R.layout.layoutname, array, false);
listview.setAdapter(adapter);

在“全选”按钮的点击监听器中添加以下代码。
MyAdapter adapter = new Save_Weight_Adapter(this, R.layout.layoutname, array, true);
listview.setAdapter(adapter);

并在适配器中进行检查

if(chk) {
    blue_check.setVisibility(View.VISIBLE);
} else {
    blue_check.setVisibility(View.GONE);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接