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


90

セクションヘッダーを使用してグリッドのようなレイアウトを実装したい。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 2016

私は初心者です。私にとって、このリンクは私に役立ちました3 RecyclerView Infinite Scroll Examples
Vijay Ram

回答:


158

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

13
get span sizeメソッドは、セルに必要なスパン幅の量を決定します。colrowの数ではありません!!
Karthik Rk、2015

1
最初のアイテムにまたがると、次のアイテムの高さを台無しにします。それは他のアイテムで動作します。何か案が ?
Ronny Shibley 2017年

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.