4

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

有人让这个工作吗?

谢谢

4

2 回答 2

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 不为空,因此如果列表视图重用其单元格,“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。

于 2013-10-22T14:45:38.900 回答
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。这种方法的最大问题是我在视图中使用了一个标签。但我认为只要除了我之外没有人使用标签,就可以了。

我希望它有所帮助。

于 2016-06-01T12:19:08.717 回答