web-dev-qa-db-ja.com

SpanSizeLookupを使用してGridLayoutManagerの項目のスパンを設定します

セクションヘッダーを使用してグリッドのようなレイアウトを実装したい。考える 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です。これを解決するにはどうすればよいですか?

83
Igor Filippov

問題は、ヘッダーのスパンサイズが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;
                }
            }
        });
142
Igor Filippov

ヘッダーには、リスト全体のスパンカウントに等しいスパンが必要です。

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

私自身の質問への回答:アダプターを設定した後、アクティビティからgetSpanSizeLookup()をオーバーライドします。

2
Rugved Mahamune