RecycleView的跨度大小

5

enter image description here

我正在尝试使用RecyclerView和GridLayoutManager来实现类似上图的布局。我已经尝试根据位置设置setSpanSizeLookup,但无法模仿上图中的设计。请问有人可以帮助我吗?

    mRecyclerView = (RecyclerView) contentView;
    mRecyclerView.setHasFixedSize(false);

    GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 3);
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return 3 - (position % 3);
        }
    });

    mRecyclerView.setLayoutManager(gridLayoutManager);

我所理解的是
这里输入图片描述


1
这是一段很长的视频,但我建议你观看它:https://www.youtube.com/watch?v=-C5I1DAviJ8 - N J
谢谢@Nilesh的帮助,我会查看它。 - user1263800
5个回答

7

您希望交替的“行”均匀分配到两个单元格中。 均匀分配需要偶数列,而3不是偶数。 因此,将其更改为2。

现在,您希望getSpanSize()按行返回:

  • 位置0 = 2(即跨越两个单元格)
  • 位置1和2 = 1(即每个占用一个单元格)
  • 位置3 = 2
  • 位置4和5 = 1
  • 等等。

(position%3)> 0?1:2 似乎可以实现这一点。


如果我想要3列2列3列,我该如何实现呢? - Mo Adel
使用Spans会有性能问题吗?(例如,如果布局每行有12列,而实际项目每行只有3或4个)。 - Mu Sa
1
@MuSa:我不知道有没有。但请确保你的 getSpanSize() 方法是快速的。 - CommonsWare

1

我解决了这个问题。这是我的代码,你将得到相同的期望输出。

GridLayoutManager mLayoutManager = new GridLayoutManager(this, 2);

    mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {

            int i = 3 - (position % 3);

            switch(i){
                case 1:
                    return 1;
                case 2:
                    return 1;
                case 3:
                    return 2;
                default:    
                    return 2; \\Optional Since it will not have a default case with the given formula
            }

0

好的,我找到了解决方案以获取此布局,首先创建如下的GrideLayoutManager。

GrideLayoutManager gridLayoutManager = new GridLayoutManager(context,2 , LinearLayoutManager.VERTICAL ,false) ;

在这里,您告诉Android一个行将由2个span组成,然后像这样设置getSpanSize。

gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {

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

这将使每个位置除以3占用2个跨度(一行)


0
 Try this i tried it for you



val spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
                    override fun getSpanSize(position: Int): Int {
                        if (position == 0) {
                            return 2
                        } else if (position == 1 || position == 2)
                            return 1
                        else if (position == 3)
                            return 2
                        else return 1

    }
    }

     val glm = GridLayoutManager(this, 2)

                glm.spanSizeLookup = spanSizeLookup
                recycler_view.layoutManager = glm

-2
您可以在您的onCreate()中添加以下内容:
   GridLayoutManager layoutManager=new GridLayoutManager(this,10);
    layoutManager.setSpanSizeLookup(new 
    GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {

            int index = position % 2;

            switch(index){
                case 0: return 1;
                case 1: return 2;
                }
         }
  }

然后将布局管理器设置为RecyclerView

recyclerview.setLayoutManager(layoutManager);

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