【问题标题】:RecycleView's span sizeRecycleView 的 span 大小
【发布时间】:2015-06-17 10:36:32
【问题描述】:

我正在尝试实现类似于上图的布局 将 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);

..

我得到了什么

【问题讨论】:

标签: android android-recyclerview gridlayoutmanager


【解决方案1】:

好吧,您希望交替的“行”在两个单元格之间均匀分布。均匀拆分需要偶数列,3 不是偶数。因此,将其更改为 2。

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

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

(position % 3) > 0 ? 1 : 2 似乎会给你这个。

【讨论】:

  • 如果我想要 3 Column 2 Column 3 Column ,我该如何实现
  • 使用 spans 有没有性能问题? (例如,如果布局每行有 12 列,而实际项目将是每行 3 或 4 个)。
  • @Musa:我不知道。不过,请确保您的 getSpanSize() 方法很快。
【解决方案2】:

我解决了。这是我的代码,您将获得相同的所需输出

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
            }

【讨论】:

    【解决方案3】:
     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
    

    【讨论】:

      【解决方案4】:

      好的,我找到了首先获得此布局的解决方案 像这样的GridLayoutManager。

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

      在这里你告诉 android 一行将包含 2 个跨度 然后让 getSpanSize 像这样。

      gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
          @Override
          public int getSpanSize(int position) {
      
              return  position % 3 == 0 ? 2: 1  
         }
      });
      

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

      【讨论】:

        【解决方案5】:

        您可以将以下内容添加到您的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;
                        }
                 }
          }
        

        之后将 layoutmanager 设置为 recyclerview

        recyclerview.setLayoutManager(layoutManager);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          • 2016-03-25
          • 1970-01-01
          • 1970-01-01
          • 2020-05-31
          • 2014-03-05
          • 2021-05-10
          相关资源
          最近更新 更多