使用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

我是新手。对我来说,此链接对我有帮助3 RecyclerView Infinite Scroll Examples
Vijay Ram

Answers:


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
获取跨度大小的方法确定您的单元格要占用的跨度宽度的数量,而不是col行的数量!
Karthik Rk 2015年

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.