如果我使用创建ListView / ListAdapter并在适配器的重写getView()方法中使用convertView,那么每个列表项视图的属性如何处理?这里有一些代码可以更好地说明:
列出项目
protected void onFinishInflate() {
super.onFinishInflate();
checkbox = (CheckedTextView)findViewById(android.R.id.text1);
description = (TextView)findViewById(R.id.description);
}
public void setTask(Task t) {
task = t;
checkbox.setText(t.getName());
checkbox.setChecked(t.isComplete());
if (t.getDescription().length() <= 0)
description.setVisibility(GONE);
else
description.setText(t.getDescription());
}
列表适配器
public View getView(int position, View convertView, ViewGroup parent) {
TaskListItem tli;
if (convertView == null)
tli = (TaskListItem)View.inflate(context, R.layout.task_list_item, null);
else
tli = (TaskListItem)convertView;
tli.setTask(currentTasks.get(position));
return tli;
}
每当刷新列表视图时(在它初始出现之后),每个列表项的TextView的visibility属性都设置为“GONE”。我花了一段时间才意识到每次视图来自convertView时该属性都会延续。在两种条件下显式设置visibility属性可以解决问题。像这样:
public void setTask(Task t) {
task = t;
checkbox.setText(task.getName());
checkbox.setChecked(task.isComplete());
if (task.getDescription().equals(""))
description.setVisibility(GONE);
else
description.setVisibility(VISIBLE);
description.setText(task.getDescription());
}
这是因为回收列表项目视图根本没有被“重置”,因为它们没有被重新膨胀吗?我觉得我理解这个概念,但我对它的把握并不像我想的那样坚定。
答案 0 :(得分:2)
这是因为回收列表项目视图根本没有“重置”,因为它们没有被重新膨胀吗?
正确。 Recycled确实意味着“回收” - 它是屏幕上的一行,您已为其他适配器位置配置,现在可以重复使用。但是你离开了那一行,所以你需要完全设置它,包括可能撤消之前对该行所做的事情。