如何更新ListView中所有项目的非绑定子视图?

时间:2011-09-11 01:39:52

标签: android android-listview simplecursoradapter android-viewbinder

我有ListView使用自定义布局,该自定义布局在自定义布局中包含5个子View个对象(4 TextView和1 CheckBox)。但是只绑定了TextViews - CheckBox在数据库中没有相应的字段。 CheckBox的目的只是确定我想在“下一步”中处理的项目。我正在使用自定义ViewBinder来正确分配文本值(因为数据库中的某些值是日期等)。

用户界面的一部分是三个按钮 - “全部”,“无”和“反转”,用于切换列表中每个项目的状态。例如,对于“全部”按钮,我使用以下代码执行此操作(我现在知道它不正确 - 我将其包含在内以显示我正在尝试执行的操作):

ListAdapter la = getListAdapter();
ListView lv = getListView();
int iCount = la.getCount();
for(int i=0; i<iCount; i++)
{
    View vv = lv.getChildAt(i);
    CheckBox cb = (CheckBox) vv.findViewById(R.id.ledgerItemCheckBox);
    cb.setChecked(true);
}

只要列表中的项目数不超过列表大小,这样就可以正常工作,这样所有项目始终可见。但是,当我超过这个数字时,'getChildAt'函数有时会返回null,因为(如果我理解正确)它不是要返回列表中的所有项目,只是那些可见的项目,这会导致{ {1}}。

如何在所有视图上正确设置NullPointerException,即使它们不可见?

1 个答案:

答案 0 :(得分:1)

创建对一个TextView数据的伪绑定,创建一个Boolean对象的ArrayList作为复选框的后端。请注意,ArrayList可能不是您应用程序的最佳数据结构。使用布尔值填充ArrayList,将布尔值设置为Cursor数据集的相应位置的初始值。绑定时使用ArrayList作为后端数据。当您选择all,none或invert时,更新ArrayList中的Boolean对象,然后在SimpleCursorAdapter上调用notifyDataSetChanged()。

添加啊,问题的另一半,是的,使用onClickListener作为CheckBoxes但使用相同的侦听器,不要为每个创建一个新对象。使用getPositionForView()方法获取您的位置并更新基础数据。