【问题标题】:ListView with two different layouts for its childrenListView 为其子项具有两种不同的布局
【发布时间】:2013-09-07 02:45:56
【问题描述】:

对于我正在开发的应用程序,我有一个带有自定义适配器的 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 中产生一些大问题。关于如何使这项工作的任何想法?顺便说一句,我知道我每次都可以创建一个新视图,但我真的很想使用 convertView 以获得明显的性能优势。

【问题讨论】:

  • 你的意思是不同的行膨胀?

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


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

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

    要从使用 convertView 中获得任何好处,您可以使用适当的描述符标记您的视图并检查 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;
    }
    

    【讨论】:

    • 我明白了,我以为是这种情况,但我不确定该怎么做。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2017-12-25
    • 2012-07-23
    相关资源
    最近更新 更多