简体   繁体   English

如何实现带有不同行数的RecyclerView?

[英]How can I implement a RecyclerView with a different number of items by rows?

I know that I can implement a RecyclerView with different views for items on Android. 我知道我可以为Android上的项目实现具有不同视图的RecyclerView。

But my need is a little bit different here. 但是我的需求在这里有点不同。 I would like to know how can I implement a RecyclerView with a different number of items by rows. 我想知道如何使用行数不同的项目来实现RecyclerView。

For example, I would have 2 items for first row, then just 1 item for second row, then 3 items for third row, ... 例如,我第一行有2个项目,第二行只有1个项目,第三行只有3个项目,...

Is it possible to implement this with a RecyclerView? 是否可以使用RecyclerView来实现? If so, How can I implement it? 如果是这样,我该如何实施?

Thanks for your help. 谢谢你的帮助。

Sylvain 西尔

What you're looking for can be done with GridLayoutManager itself, the only trick here is to use the least common multiple (lcm) of your column counts per row as your total span count. 您要查找的内容可以使用GridLayoutManager本身完成,这里的唯一技巧是使用每行列数的最小公倍数(lcm)作为总跨度数。 Here is an easy example: 这是一个简单的例子:

@Override
public void onCreate() {
    super.onCreate();

    ...

    int spanCount = lcm(2, 1, 3, 8);
    GridLayoutManager layoutManager = new GridLayoutManager(this, spanCount);
    layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            int numberOfColumns;
            switch (position) {
                case 0:
                    numberOfColumns = 2;
                    break;
                case 1:
                    numberOfColumns = 1;
                    break;
                case 2:
                    numberOfColumns = 3;
                    break;
                case 3:
                    numberOfColumns = 8;
                    break;
                default:
                    numberOfColumns = spanCount;
            }
            return spanCount / numberOfColumns;
        }
    });
    recyclerView.setLayoutManager(layoutManager);

    ...
}

public static int lcm(int... input) {
    int result = input[0];
    for(int i = 1; i < input.length; i++) result = lcm(result, input[i]);
    return result;
}

是的,有可能,您只需要创建不同的Views并将它们放入if (holder instanceof ProfileAdapter.VideoViewHolder) { } else { }然后使用public int getItemViewType(int position) { }将视图扔进上述方法中

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM