Как получить липкие / закрепленные заголовки в ExpandableListView?

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

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

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

Solutions Collecting From Web of "Как получить липкие / закрепленные заголовки в ExpandableListView?"

Мне удалось получить закрепленные заголовки, работающие над 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 и ссылку. Расширяемые списки с прикрепленными заголовками выглядят великолепно!

Ну, я сделал всего 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); 

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