SpanSizeLookup을 사용하여 GridLayoutManager의 항목에 대한 범위 설정


91

섹션 헤더로 그리드와 같은 레이아웃을 구현하고 싶습니다. 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입니다. 어떻게 해결합니까?


이 구현은 나에게 맞는 것 같습니다. mAdapter.getItemViewType(position)올바른 값을 반환하는 경우 디버깅 했습니까 ?
yigit 2014

1
"1"은 "-1"보다 더 안전한 기본값처럼 보입니다.
BladeCoder

나는 초보자입니다. 저에게이 링크는 3 RecyclerView Infinite Scroll 예제
Vijay Ram

답변:


160

문제는 헤더의 범위 크기가 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;
                }
            }
        });

14
get span size 메서드는 셀이 가져갈 범위 너비를 결정합니다.
Karthik Rk

1
첫 번째 항목을 확장 할 때 다음 항목의 높이를 엉망으로 만듭니다. 다른 항목에서도 작동합니다. 어떤 생각?
Ronny Shibley

1
@RonnyShibley 위에서 언급 한 문제에 대한 모든 해결책 ... 나는 또한 동일한 문제에 직면하고 있습니다. 헤더 후 첫 번째 항목이 표시되지 않고 다른 항목은 모두 필요에 따라 표시됩니다.
Umair

이것은 워킹이 아닙니다.
Mahdi

34

헤더는 전체 목록의 범위 수와 동일한 범위를 가져야합니다.

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;
                }
    }
});

2

내 질문에 대한 대답 : 어댑터를 설정 한 후 Activity에서 getSpanSizeLookup ()을 재정의하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.