Как получить закрепленные / закрепленные заголовки в ExpandableListView? - PullRequest
8 голосов
/ 06 июня 2011

Кому-нибудь посчастливилось адаптировать PinnedHeaderListView , чтобы его можно было использовать с ExpandableListView вместо простого ListView с индексированными разделами? Я в основном хочу ExpandableListView, где каждое представление элемента группы остается закрепленным наверху, пока оно не будет выдвинуто следующим представлением группы.

Я изучил код, чтобы попытаться выяснить, как работает PinnedHeaderListView, и кажется, что его будет трудно адаптировать к ExpandableListView. Основная проблема заключается в использовании другого типа адаптера и методологии рисования. PinnedHeaderListView использует SectionIndexer для отслеживания положения секций. Когда он рисует каждый элемент с getView(), он проверяет, является ли этот элемент началом нового раздела. Если элемент является началом нового раздела, он делает видимым заголовок раздела в пределах вида элемента list_item. У ExpandableListAdapter есть getChildView() и getGroupView(), чтобы рисовать элементы и разделы отдельно как различные элементы списка.

Я уверен, что должен быть какой-то способ использования методологии из PinnedHeaderListView для получения аналогичного поведения в ExpandableListView, но я не уверен, с чего начать.

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Мне удалось получить закрепленные заголовки, работающие с демоверсией API ExpandableList1 .

Самой сложной проблемой, с которой я столкнулся, было выяснение, как заставить SectionIndexer хорошо играть с расширяющимися списками. Как было показано в моем вопросе, я думал об этом все неправильно. В своей первоначальной попытке решить эту проблему я создал объект SectionIndexer в MyExpandableAdapter и сопоставил его с моими данными, подобно тому, как это делается в приложении «Контакты» и в примере с Питером. Это работает в приложении «Контакты», поскольку позиции плоского списка статически соответствуют набору данных. В расширяемом виде списка позиции плоского списка меняются по мере того, как группы расширяются и исчезают.

Итак, решение состоит не в том, чтобы сопоставить индексатор раздела с данными, а с экземпляром вашего 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));
    }

Есть, конечно, другие изменения, которые вы должны сделать, чтобы все это заработало, но описанные выше методы являются ключевыми. Я выложу полный код в код Google или GitHub и ссылку отсюда в ближайшее время. Списки ExpandableList с закрепленными заголовками выглядят великолепно!

2 голосов
/ 17 мая 2016

Ну, я сделал всего за 3 шагов:

1. Добавить compile 'com.diegocarloslima:fgelv:0.1.+@aar' в build.gradle

2. Добавить ExpandableListView в формате xml.

<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);

Надеюсь, это поможет вам.

...