Я хочу реализовать макет в виде сетки с заголовками разделов. Подумайте о https://github.com/TonicArtos/StickyGridHeaders
Что я делаю сейчас:
mRecyclerView = (RecyclerView) view.findViewById(R.id.grid);
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
switch(mAdapter.getItemViewType(position)){
case MyAdapter.TYPE_HEADER:
return 1;
case MyAdapter.TYPE_ITEM:
return 2;
default:
return -1;
}
}
});
mRecyclerView.setLayoutManager(mLayoutManager);
Теперь и обычные элементы, и заголовки имеют размер 1. Как решить эту проблему?
android
android-support-library
android-recyclerview
gridlayoutmanager
Игорь Филиппов
источник
источник
mAdapter.getItemViewType(position)
возвращает правильное значение?Ответы:
Проблема заключалась в том, что заголовок должен иметь размер диапазона 2, а обычный элемент должен иметь размер диапазона 1. Итак, правильные реализации:
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { switch(mAdapter.getItemViewType(position)){ case MyAdapter.TYPE_HEADER: return 2; case MyAdapter.TYPE_ITEM: return 1; default: return -1; } } });
источник
Заголовок должен иметь диапазон, равный количеству диапазонов всего списка.
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { switch(mAdapter.getItemViewType(position)){ case MyAdapter.TYPE_HEADER: return mLayoutManager.getSpanCount(); case MyAdapter.TYPE_ITEM: return 1; default: return -1; } } });
источник
Ответ на мой собственный вопрос: переопределите getSpanSizeLookup () из Activity после настройки адаптера.
источник