По мощью MergeAdapter, StickyListHeaders и ListViewAnimations вместе я капитан Android

Кто-нибудь присоединился к файлам MergeAdapter, StickyListHeaders и ListViewAnimations?

Мои потребности:

  • Несколько списков в одном вертикальном прокрутке
  • Разнородные позиции позиций
  • Несколько элементов списка, разделенных заголовками, которые должны быть липкими
  • Возможность расширения некоторых элементов списка
  • Drag'n'drop некоторые из них
  • Поддержка Android 14+

Мои дополнительные услуги:

  • Полагаться на CursorAdapters

Cherrypick:

  • Иногда мой самый верхний заголовок (который является отдельным видом, а не частью моего списка, и я предпочту, чтобы он оставался таким образом), нужно немного переместиться наверх; Мой комбинированный список должен следовать, но в то же время оживлять его высоту, чтобы всегда быть привязанным к дну.

Упомянутыми библиотеками были:

  • MergeAdapter – https://github.com/commonsguy/cwac-merge
  • StickyListHeaders – https://github.com/emilsjolander/StickyListHeaders
  • ListViewAnimations – https://github.com/nhaarman/ListViewAnimations

Пожалуйста, дайте мне некоторую надежду, если это возможно, и некоторые полезные советы, как избежать ловушек. Возможно, я должен использовать некоторые другие библиотеки. Или я просто должен написать это сам 🙁

==== ==== EDITED

В конце концов, мне удалось создать заглушку того, что я надеялся сделать (в начале 2014 года). Это функциональный расширяемый и перетаскиваемый список и адаптер lib с приятной анимацией (пока нет липких заголовков). Вот репо:

  • https://github.com/fada21/HydraListAndroid

Поскольку RecyclerView теперь доступен, нет необходимости использовать сложный код списка. Вот краткое руководство по переходу – http://andraskindler.com/2014/11/22/migrating-to-recyclerview/ .

Из вики-страницы ListViewAnimations: http://nhaarman.github.io/ListViewAnimations/#getting-started

ListViewAnimations также поддерживает анимацию внешнего вида на StickyListHeaderListViews. Вы должны обернуть свой AnimationAdapter в StickyListHeadersAdapterDecorator:

StickyListHeadersListView listView = (...); AlphaInAnimationAdapter animationAdapter = new AlphaInAnimationAdapter(adapter); StickyListHeadersAdapterDecorator stickyListHeadersAdapterDecorator = new StickyListHeadersAdapterDecorator(animationAdapter); stickyListHeadersAdapterDecorator.setStickyListHeadersListView(listView); listView.setAdapter(stickyListHeadersAdapterDecorator); 

Как и обычный ListView, вы можете использовать любую реализацию класса AnimationAdapter.

В сочетании с решением от StickyListHeaders и MergeAdapter следует понимать uber-mergeadapter: P

Я закончил создание адаптера для обработки заголовков.

Использование класса адаптера:

 StickyHeaderMergeAdapter stickyHeaderMergeAdapter = new StickyHeaderMergeAdapter(this.getActivity(), R.layout.list_item_header, R.id.text1); stickyHeaderMergeAdapter.addAdapter( myTypcalAdapter, R.string.stringName ); this.stickyHeaderListView.setAdapter(stickyHeaderMergeAdapter); 

Класс адаптера:

 package mypackagename.widget; import android.content.Context; import android.support.annotation.IdRes; import android.support.annotation.LayoutRes; import android.support.annotation.StringRes; import android.view.View; import android.view.ViewGroup; import android.widget.ListAdapter; import android.widget.TextView; import com.commonsware.cwac.merge.MergeAdapter; import org.apache.commons.lang3.NotImplementedException; import java.util.LinkedHashMap; import se.emilsjolander.stickylistheaders.StickyListHeadersAdapter; public class StickyHeaderMergeAdapter extends MergeAdapter implements StickyListHeadersAdapter { private final LinkedHashMap<ListAdapter,Integer> adapterViewHashMap = new LinkedHashMap<>(); private final Context context; private final int headerLayoutId; private final int headerLayoutTextId; public StickyHeaderMergeAdapter(Context context, @LayoutRes int headerLayoutId, @IdRes int headerLayoutTextId) { this.context = context; this.headerLayoutId = headerLayoutId; this.headerLayoutTextId = headerLayoutTextId; } public void addAdapter(ListAdapter listAdapter, @StringRes int stringId) { super.addAdapter(listAdapter); this.adapterViewHashMap.put(listAdapter, stringId); } @Override public void addAdapter(ListAdapter adapter) { throw new NotImplementedException("You should use addAdapter(ListAdapter, View)"); } @Override public View getHeaderView(int position, View convertView, ViewGroup parent) { if (convertView == null) convertView = View.inflate(this.context, this.headerLayoutId, null); ((TextView) convertView.findViewById(this.headerLayoutTextId)).setText( this.adapterViewHashMap.get(this.getAdapter(position)) ); return convertView; } @Override public long getHeaderId(int i) { ListAdapter listAdapter = this.getAdapter(i); if (!this.adapterViewHashMap.containsKey(listAdapter)) return 0; return this.adapterViewHashMap.get(listAdapter); } }