对于我正在开发的应用程序,我有一个带有自定义适配器的 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/