SimpleExpandableListAdapter和expandedGroupLayout

时间:2013-10-22 14:00:07

标签: java android expandablelistadapter

我正在尝试使用 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。

任何人都有这个工作吗?

由于

2 个答案:

答案 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。 这种方法最大的问题是我在视图中使用了一个标签。但我认为只要没有人使用标签,但我没关系。

我希望它有所帮助。