我正在使用GridLayoutManager,因此动态设置recyclerview的列数(每行)。这是我的代码:

GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 2);
        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                int num = 0;
                if(position == 0)
                    num = 2;
                else if(position == 1)
                    num = 1;
                else if (position % 4 == 0)
                    num = 1;
                else
                    num = 2;
                Log.i("spansize", "spansize: " + num);
                return num;
            }
        });

        mAdapter = new ImageAdapter(getActivity(), mBlessingPics, options, ImageAdapter.POPULAR);

        mPopularImagesGrid.setLayoutManager(gridLayoutManager);

        mPopularImagesGrid.setAdapter(mAdapter);
        mAdapter.setOnClick(this);


但是,看来列数没有更新。请看下面的图片:
android - GridLayoutManager spansizelookup不起作用-LMLPHP

我可以在logcat中验证spansize的数量是从2还是1更改,但是实际的recyclerview没有显示它。它仅显示每行单列/跨度。

编辑:
我无法使第一行中有2个项目/列。第二项始终放置在第二行中。我打算在第二行中增加一列,以取代将占据整行的原生广告。我在我的spansizelookup中使用它:
return (position % 3) == 0 ? 1 : 2;
android - GridLayoutManager spansizelookup不起作用-LMLPHP

最佳答案

这是方法的重要部分:

if(position == 0)
    num = 2;
else if(position == 1)
    num = 1;
else if (position % 4 == 0)
    num = 1;
else
    num = 2;


因此,位置14, 8, 12, 16...的跨度大小将为1,其他所有位置的跨度大小将为2。这意味着跨度大小为1的两个项目之间绝不会相邻,并且由于网格只有两个跨度宽,因此所有内容都必须位于自己的行中。我使用了您的SpanSizeLookup,但布局简单,我看到了这一点:

android - GridLayoutManager spansizelookup不起作用-LMLPHP

因此,如果您有时希望看到两个彼此相邻的图像,而有时仅看到一个图像,则需要使用不同的算法来查找跨度大小。例如:

return (position % 3) == 0 ? 2 : 1;


android - GridLayoutManager spansizelookup不起作用-LMLPHP

07-25 21:10