我有一个自定义对象列表,我将其加载到ActivityList中,允许多个选择并显示右侧的复选框。这些自定义对象包含名为“enabled”的字段。当我加载数据时,我想滚动对象列表,并选中代表一个对象的复选框,该对象的启用字段标记为true。目前我按要求将所有记录加载到ActivityList中,但即使对象标记为“已启用”,我也无法将任何行“检查”。
这是我用来将行标记为已检查的代码
for (int i = 0; i < sourceList.length; i++) {
DataSource d = sourceList[i];
view.getChildAt(i).getClass().toString());
CheckedTextView checkView = (CheckedTextView)view.getChildAt(i);
checkView.setChecked(Boolean.parseBoolean(d.enabled));
}
我在调用setListAdapter后直接放了这段代码,并把它放在onContentChanged()函数中。但是,在这两个地方都没有显示行,因此view.getChildAt(i)返回null,因此显然不会检查该行。
任何人都可以告诉我在哪里可以放置此代码,以便在所有行添加并显示在屏幕上后执行它?
谢谢!
最初我没有使用ArrayAdapter的自定义适配器。为了覆盖getView()方法,我创建了一个自定义适配器和扩展的ArrayAdapter。我仍然允许ArrayAdapter类完成大部分工作,但我重写了getView()。这是我的getView()
代码@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = super.getView(position, convertView, parent);
if (convertView.getClass() == CheckedTextView.class){
CheckedTextView checkView = (CheckedTextView)convertView;
DataSource d = getItem(position);
checkView.setText(d.getName());
checkView.setChecked(Boolean.parseBoolean(d.enabled));
}
return convertView;
}
即使使用此代码,也不会检查任何复选框。 DataSource的名称字段被设置为文本,但setChecked()方法似乎不适合我。我也尝试过编码
checkView.setChecked(true);
这对我也不起作用。你对我可能做错了什么有什么想法吗?
再次感谢!
答案 0 :(得分:0)
你能展示你的适配器代码吗?致电setChecked
的地方位于适配器的getView
代码中。它将类似于:
@Override
getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.my_list_row, parent, false);
}
CheckedTextView checkView = (CheckedTextView)
convertView.findViewById(R.id.check_view);
DataSource d = sourceList[i];
checkView.setChecked(Boolean.parseBoolean(d.enabled));
return convertView;
}
ListView并没有真正通过getChildAt
公开其子女。预期的界面是通过构造和填充getView
中的行。
答案 1 :(得分:0)
您需要做的是在myList.setItemChecked(position, Boolean.parseBoolean(d.enabled));
方法中调用getView
(其中myList
是ListView
的实例)。
另外,请确保在设置列表适配器之前调用myList.setChoiceMode(int choiceMode)
。
如果您在另一个视图中有Checkable
个视图,则包含视图需要实现Checkable
以及列表中的可检查项目才能正常工作(例如,请参阅CheckableRelativeLayout)