Chcę zaimplementować układ podobny do siatki z nagłówkami sekcji. Pomyśl o https://github.com/TonicArtos/StickyGridHeaders
Co ja teraz robię:
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);
Teraz zarówno zwykłe elementy, jak i nagłówki mają rozmiar rozpiętości 1. Jak to rozwiązać?
mAdapter.getItemViewType(position)
zwraca prawidłową wartość?Odpowiedzi:
Problem polegał na tym, że nagłówek powinien mieć rozmiar rozpiętości 2, a zwykły element powinien mieć rozmiar rozpiętości 1. Tak więc poprawne implementacje to:
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; } } });
źródło
Nagłówek powinien mieć rozpiętość równą liczbie rozpiętości całej listy.
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; } } });
źródło
Odpowiedź na moje własne pytanie: po ustawieniu adaptera zastąp metodę getSpanSizeLookup () z działania.
źródło