选择ListView的所有项目(带有复选框的自定义行)

时间:2011-02-09 07:59:07

标签: android android-listview

我有什么:我有一个带有自定义行的ListView,有一个CheckBox&每行两个TextView。我有一个“全选”按钮。

我想要的是什么:我希望当我点击按钮时,ListView中的所有CheckBox都会被选中/取消选中。

有什么问题:在OnClick中选择“全选”按钮。我这样做:

public void OnClickSelectAllButton(View view)
{
    ListView l = getListView();
    int count = l.getCount();
    for(int i=0; i<count; ++i) 
    {
       ViewGroup row = (ViewGroup)l.getChildAt(i);
       CheckBox check = (CheckBox) row.findViewById(R.id.checkBoxID);
       check.setChecked(true); // true for select all and false for unselect all etc..
    }
}

此处 l.getChildAt(i)仅向我提供可见项目。当索引超出可见项时,就会出现问题。我想检查列表中的所有CheckBox,而不仅仅是可见的。

3 个答案:

答案 0 :(得分:21)

会发生这种情况,因为ListView适配器会重用视图。你试图做的方式是不正确的。我认为您不应该通过listview子代访问listview行。

在您的活动中引入一个变量,该变量将保持当前状态(boolean checkAll)。当用户按下按钮时,它必须将“checkAll”设置为true,并在ListView的适配器上调用notifyDataSetChanged()(对于arrayadapter)或requery()(对于cursoradapter)。在适配器的getView()方法中引入了对此标志的检查,因此if (checkAll) {check the check box}

答案 1 :(得分:3)

你看过Correct way to check all checkboxes in ListView?

了吗?
int count = getListAdapter().getCount();

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

列表视图中的每个项目都应该像CheckableRelativeLayout一样可以实现Checkable接口。