我有什么:我有一个带有自定义行的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,而不仅仅是可见的。
答案 0 :(得分:21)
会发生这种情况,因为ListView适配器会重用视图。你试图做的方式是不正确的。我认为您不应该通过listview子代访问listview行。
在您的活动中引入一个变量,该变量将保持当前状态(boolean checkAll
)。当用户按下按钮时,它必须将“checkAll”设置为true,并在ListView的适配器上调用notifyDataSetChanged()
(对于arrayadapter)或requery()
(对于cursoradapter)。在适配器的getView()
方法中引入了对此标志的检查,因此if (checkAll) {check the check box}
答案 1 :(得分:3)
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接口。