列表项视图属性如何使用convertView在ListView中工作?

时间:2011-06-24 00:20:49

标签: android

如果我使用创建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());
}

这是因为回收列表项目视图根本没有被“重置”,因为它们没有被重新膨胀吗?我觉得我理解这个概念,但我对它的把握并不像我想的那样坚定。

1 个答案:

答案 0 :(得分:2)

  

这是因为回收列表项目视图根本没有“重置”,因为它们没有被重新膨胀吗?

正确。 Recycled确实意味着“回收” - 它是屏幕上的一行,您已为其他适配器位置配置,现在可以重复使用。但是你离开了那一行,所以你需要完全设置它,包括可能撤消之前对该行所做的事情。