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

时间:2011-06-06 06:35:26

标签: android expandablelistview sticky expandablelistadapter

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

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

我确信必须有一些方法可以使用PinnedHeaderListView中的方法在ExpandableListView中获得类似的行为,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:4)

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

我遇到的最困难的问题是弄清楚如何让SectionIndexer与扩展列表很好地配合。正如我的问题所证明的那样,我认为这一切都是错的。在我最初尝试解决这个问题时,我在MyExpandableAdapter中创建了一个SectionIndexer对象并将其映射到我的数据,类似于在Contacts应用程序和Peter的例子中完成的操作。这适用于“联系人”应用,因为平面列表位置与数据集静态匹配。在可扩展列表视图中,随着组的扩展和扩展,平面列表位置会发生变化。

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

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

    @Override
    public int getSectionForPosition(int position) {
        return ExpandableListView.getPackedPositionGroup(mView
                .getExpandableListPosition(position));
    }

当然,为了让这一切全部有效,你必须做出其他改变,但上述方法才是关键。我会将完整的代码发布到谷歌代码或github,并很快从这里链接。带有固定标题的ExpandableLists看起来很棒!

答案 1 :(得分:2)

我已经完成了 3 步骤:

1。 build.gradle

中添加compile 'com.diegocarloslima:fgelv:0.1.+@aar'

2. 在xml中添加 ExpandableListView

<com.diegocarloslima.fgelv.lib.FloatingGroupExpandableListView
        android:id="@+id/expandableListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:groupIndicator="@null" />

3。 Java代码:

FloatingGroupExpandableListView expandableListView = (FloatingGroupExpandableListView) findViewById(R.id.expandableListView);
MyexpandableListAdapter adapter = new MyexpandableListAdapter(context, mList);
WrapperExpandableListAdapter wrapperAdapter = new WrapperExpandableListAdapter(adapter);
expandableListView.setAdapter(wrapperAdapter);

希望这会对你有所帮助。