Установить диапазон для элементов в GridLayoutManager, используя SpanSizeLookup
Я хочу реализовать решетчатый макет с заголовками разделов. Подумайте о 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. Как это решить?
3 ответа
Решение
Проблема состояла в том, что заголовок должен иметь размер промежутка 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 после установки адаптера.