我正在尝试使用 SimpleExpandableListAdapter ,无论是否扩展,我都需要不同的布局布局。
有一个构造函数允许为组传递两个布局:
SimpleExpandableListAdapter(Context context,
List<? extends Map<String, ?>> groupData,
int expandedGroupLayout,
int collapsedGroupLayout,
String[] groupFrom,
int[] groupTo,
List<? extends List<? extends Map<String, ?>>> childData,
int childLayout,
String[] childFrom,
int[] childTo)
我传递了两种不同的布局,但只显示了collapsedGroupLayout。
任何人都有这个工作吗?
由于
答案 0 :(得分:3)
我查看了SimpleExpandableListAdapter的源代码,看起来有一个错误:
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
View v;
if (convertView == null) {
v = newGroupView(isExpanded, parent);
} else {
v = convertView;
}
bindView(v, mGroupData.get(groupPosition), mGroupFrom, mGroupTo);
return v;
}
我们可以看到,如果convertView不为null,因此如果listview重用其单元格,则“isExpanded”参数将永远不会被使用。因此,如果单元格可见并被单击,则convertView将按原样重复使用,并且永远不会使用其他布局。
对我来说,一个快速的解决方案是重写getGroupView并每次为convertView传递null:
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
return super.getGroupView(groupPosition, isExpanded, null, parent);
}
更好的解决方案是保留组位置及其状态的列表,如果状态发生变化则不重用convertView。
答案 1 :(得分:0)
我想出了另一个想法来解决这个问题。
我正在使用以下getGroupView覆盖:
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
View v;
if (convertView != null && ((Boolean) convertView.getTag()) == isExpanded) {
v = super.getGroupView(groupPosition, isExpanded, convertView, parent);
} else {
v = super.getGroupView(groupPosition, isExpanded, null, parent);
v.setTag(isExpanded);
}
return v;
}
只有当convertView具有不同的布局时,才会强制获取新的布局,具体取决于isExpanded参数。在创建(展开和折叠)2个视图后,Android将重用正确的convertView。 这种方法最大的问题是我在视图中使用了一个标签。但我认为只要没有人使用标签,但我没关系。
我希望它有所帮助。