如何在ExpandableListView中获取粘滞/固定标头?

joe*_*can 8 android sticky expandablelistview expandablelistadapter

有没有人有任何运气适应PinnedHeaderListView,以便它可以与ExpandableListView一起使用,而不仅仅是一个带索引部分的简单ListView?我基本上想要一个ExpandableListView每个组项视图保持固定在顶部的位置,直到它被下一个组视图向上推.

我研究了代码,试图弄清楚PinnedHeaderListView它是如何工作的,似乎很难适应ExpandableListView.主要问题似乎在于使用不同类型的适配器和绘图方法.A PinnedHeaderListView用于SectionIndexer跟踪部分位置.当它绘制每个项目时getView(),检查项目是否是新部分的开头.如果该项目是新部分的开头,则会项目list_item视图中显示部分标题.一个ExpandableListAdapter具有getChildView()getGroupView()单独绘制的项目和部分不同的列表项.

我确信必须有一些方法来使用这种方法PinnedHeaderListView来获得类似的行为ExpandableListView,但我不知道从哪里开始.

joe*_*can 4

我能够在ExpandableList1 APIdemo上获得固定标题。

我面临的最困难的问题是弄清楚如何让SectionIndexer 很好地处理扩展列表。正如我的问题所证明的那样,我的想法都是错误的。在我最初尝试解决此问题时,我在 MyExpandableAdapter 中创建了一个 SectionIndexer 对象并将其映射到我的数据,类似于在联系人应用程序和 Peter 的示例中完成的方式。这在联系人应用程序中有效,因为平面列表位置与数据集静态匹配。在可扩展列表视图中,平面列表位置随着组的扩展而变化。

因此,解决方案是不要将部分索引器映射到数据,而是映射到 ExpandableListView 的实例。使用此解决方案,您甚至不需要示例中使用的SectionIndexer 对象。您只需要将SectionIndexer 实现方法包装在ExpandableListView 方法周围,如下所示:

    @Override
    public int getPositionForSection(int section) {
        return mView.getFlatListPosition(ExpandableListView
                .getPackedPositionForGroup(section));
    }

    @Override
    public int getSectionForPosition(int position) {
        return ExpandableListView.getPackedPositionGroup(mView
                .getExpandableListPosition(position));
    }
Run Code Online (Sandbox Code Playgroud)

当然,您还必须进行其他更改才能使其正常工作,但上述方法是关键。我很快会将完整的代码发布到 google code 或 github 并从这里链接。带有固定标题的 ExpandableList 看起来很棒!