【发布时间】:2015-06-10 15:00:28
【问题描述】:
我必须显示一个包含不同类型视图的列表。所以我必须用一个适配器定义一个 ListView,我必须在其中膨胀多个视图。我已经通过example 给出,但问题是我的列表不是对称的,就像每次在 4 个项目后重复标题的示例一样。所以我在getView()中面临重复使用项目的问题@
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_1:
convertView = mInflater.inflate(R.layout.item1, null);
.......
break;
case TYPE_2:
convertView = mInflater.inflate(R.layout.item2, null);
.......
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
............
............
}
现在如果convertView 不为null,但之前使用的item 类型不同,那么布局将不匹配。这段代码将如何处理这个问题?
【问题讨论】:
-
不要为 convertview 检查 null 条件,这将始终使项目布局膨胀。
-
您需要为 item1 和 item2 布局创建 2 个
ViewHolder,并且在else中convertView !=null您需要检查type并转换为ViewHolder1或ViewHolder2。 ..你怎么看? -
如果列表视图项具有非对称布局,那么您可以拥有包含所有必需元素的单个列表项 xml,并且在基于类型的 getView 方法中您可以设置可见性显示/隐藏/消失。
-
假设第一项是类型 1(具有 layout_1),它将在第 8 个元素中重用,即类型 2(具有 layout_2)。现在,如果第一个项目的标签(实际上是 ViewHolder1 的对象)将其转换为 ViewHolder2,它会起作用吗?此外,布局也会有所不同。它将如何运作?
标签: android listview baseadapter layout-inflater getview