android - ListView 的 subview 有两种不同的布局

标签 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 来获得明显的性能优势。

最佳答案

您重用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;
}

关于android - ListView 的 subview 有两种不同的布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18664055/

相关文章:

android - 如何删除突出显示但未选择的 ListView 项目?

android - 如何执行 shell 文件?

android - 在 Android 中为不同的语言使用不同的字体

java - 如何在 mp4 视频文件中添加 MOOV 原子

android - 为什么 marginBottom 不起作用?

android - 如何用动画交换 ListView 项目?

android - listview - 以编程方式为 listview 的项目设置负边距

java - 使用 CountDownTimer 在特定时间在 Firestore 上设置特定数据

android - 在 onDestroy() 中调用 finish() 有意义吗?

Android BluetoothLeScanner startScan PendingIntent 28 次后在系统范围内失败