ListView为其子级提供两种不同的布局

时间:2013-09-06 18:14:07

标签: android android-layout android-listview android-adapter

对于我正在处理的应用程序,我有一个带有自定义适配器的ListView。在这个ListView中,我想给一个正常布局或特殊布局的项目,所以我在我的适配器中有以下结构:

public View getView(int position, View convertView, ViewGroup parent) {
    View listItem;

    ...

    if (specialItem) {
        listItem = setUpSpecialItem(convertView);
    } else {
        listItem = setUpNormalItem(convertView);
    }

    return listItem;

}

private View setUpSpecialItem(View convertView) {
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    View listItem;

    if (convertView == null) {
        listItem = new View(mContext);
        listItem = layoutInflater.inflate(R.layout.special_list_item, null);
    } else {
        listItem = (View) convertView;
    }

    ...

    return listItem;
}

private View setUpNormalItem(View convertView) {
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    View listItem;

    if (convertView == null) {
        listItem = new View(mContext);
        listItem = layoutInflater.inflate(R.layout.normal_list_item, null);
    } else {
        listItem = (View) convertView;
    }

    ...

    return listItem;
}

这里的问题是,当填充列表中的项目时,convertView已经有一个通常不正确的布局。显然,这会在ListView中产生一些大问题。关于如何使这项工作的任何想法?我知道每次都可以创建一个新的View,但我真的很想使用convertView获得明显的性能优势。

2 个答案:

答案 0 :(得分:1)

  

我知道每次都可以创建一个新的View,但我真的很想使用convertView获得明显的性能优势。

如果convertView不是正确的View类型,那么无论如何都需要创建一个新的视图。

要获得使用convertView的任何好处,您可以使用适当的描述符标记View,并检查convertView的标记。例如:

private View setUpSpecialItem(View convertView) {
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    View listItem;

    if (convertView == null || !convertView.getTag().equals("special")) {
        // Update the convertView with the correct data
    } else {
        listItem = layoutInflater.inflate(R.layout.special_list_item, null);
        listItem.setTag("special");
    }

    return listItem;
}

答案 1 :(得分:1)

您重复使用View的愿望值得称赞。但是,当前一个View类型错误时,使用代码显然会失败。您需要添加的是确定先前View是否属于正确类型的某种方式:

private final static int tagCode = 27835648297; // arbitrary
private final static Integer tagSpecial = 2;
private final static Integer tagNormal  = 1;

private View setUpSpecialItem(View convertView) {
    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
    View listItem;

    if ((convertView != null) && ((Int)convertView.getTag(tagCode) == tagSpecial) {
        listItem = (View) convertView;
    }
    else {
        listItem = new View(mContext);
        listItem = layoutInflater.inflate(R.layout.special_list_item, null);
        listItem.setTag(tagCode, (Object) tagSpecial);
    }
    ...

    return listItem;
}