使用SpanSizeLookup为GridLayoutManager中的项设置跨度大小

105

我想要实现带有区域标题的网格布局。可以参考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的span大小。我该怎么解决?


这个实现在我看来是正确的。你调试过 mAdapter.getItemViewType(position) 是否返回了正确的值吗? - yigit
1
“1” 似乎比 “-1” 更安全的默认值。 - BladeCoder
1
我是一名新手。对我来说,这个链接帮助了我 3个RecyclerView无限滚动示例 - Vijay Ram
3个回答

175
问题在于标题应该具有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;
                }
            }
        });

21
get span size 方法确定了单元格所占的跨度宽度,而非行和列应该拥有的数量!请注意不要改变原意。 - Karthik Rk
1
当跨越第一个项目时,它会破坏下一个项目的高度。该方法适用于其他任何项目。有什么想法吗? - Ronny Shibley
1
@RonnyShibley,你提出的问题有解决方案吗?我也遇到了同样的问题,标题后的第一项没有显示出来,其他都正常显示。 - Umair
1
这不起作用。 - Mahdi

46

头部应该有一个跨度等于整个列表跨度计数的 span 标签。

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

为什么没有人链接到实际文档:https://developer.android.com/reference/kotlin/androidx/recyclerview/widget/GridLayoutManager.SpanSizeLookup 因此,这个答案对我来说似乎更准确,比当前接受的答案更好。也许可以创建一个带有跨度计数的const变量,并在GridLayoutManager构造函数和getSpanSize方法中使用它,以避免每个标题调用getSpanCount。 - Bruno Bieri

2

回答自己的问题: 在设置适配器后,覆盖Activity中的getSpanSizeLookup()方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接