android - Recyclerview 与 Gridlayoutmanager

标签 android android-recyclerview gridlayoutmanager

我正在使用 RecyclerViewGridLayout 管理器来制作像旅行一样的座位预订布局。

我的问题是当我的列是随机的时如何自动检测 spancount?

我知道 spanCount = recyclerViewWidth/singleItemWidth;,但问题是 singleItemWidth 不同,因为座位宽度不同。

这是我想要的布局:

enter image description here

...但我现在得到的是这样的:

enter image description here

这是我用来安排座位布局的代码:

    gridLayoutManager=new GridLayoutManager(this,totalRows, LinearLayoutManager.VERTICAL,
            false);
    gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            int rows=Integer.parseInt(upperlist.get(position).get("row"));
             return (rows);///(int) (mRecyclerView.getMeasuredWidth()/ 10);
        }
    });
     mRecyclerView.setLayoutManager( gridLayoutManager);
    MyAdapter myAdapter=new MyAdapter(this,gridArray);

... upperlist 包含这些值:

 [{cols=8, seatNumber=29U, row=4, zindex=1}, 
  {cols=6,seatNumber=23U, row=4, zindex=1},
  {cols=4,seatNumber=21U,row=4, zindex=1}, 
  {cols=2, seatNumber=11U, row=4, zindex=1}, 
  {cols=0,seatNumber=9U,row=4, zindex=1},

  {cols=8,seatNumber=25U, row=2, zindex=1}, 
  {cols=6,seatNumber=17U, row=2, zindex=1}, 
  {cols=4,seatNumber=13U, row=2, zindex=1}, 
  {cols=2,seatNumber=5U,  row=2, zindex=1}, 
  {cols=10, seatNumber=D2U,row=2, zindex=1}, 
  {cols=0, seatNumber=1U, row=2, zindex=1}, 

  {cols=8, seatNumber=26U, row=1, zindex=1},
  {cols=6,seatNumber=18U, row=1, zindex=1}, 
  {cols=4,seatNumber=14U, row=1, zindex=1},
  {cols=2,seatNumber=6U,  row=1, zindex=1}, 
  {cols=0,seatNumber=2U,  row=1, zindex=1}]

这是一个单独的列表,其中的行和列具有不同的值。因此,我需要一种适用于所有布局的通用方法。

最佳答案

我猜“cols”参数定义了项目应该放置的列,对吧? 如果是这种情况,您应该为该参数取所有项目的最大值。 在本例中为“10”。由于所有项目似乎跨越 2 个 cloumns,每个项目的跨度大小为 2,最大跨度索引为 11。因此,您的跨度计数应为 12(从 0 到 11)。

现在您必须找出空白处。例如。第 3 行中根本没有项目,根据您的数据,第 1 行和第 4 行末尾有一个空元素。因此,您应该定义一个空项(-> View 类型!),它代表布局中的空白区域。

最后,根据项目的行索引和列索引对项目列表进行排序,从而实现以下结构:

[ //row 1
  {cols=0, seatNumber=2U, row=1, zindex=1},
  {cols=2, seatNumber=6U, row=1, zindex=1}, 
  {cols=4, seatNumber=14U, row=1, zindex=1},
  {cols=6, seatNumber=18U, row=1, zindex=1},
  {cols=8, seatNumber=26U, row=1, zindex=1},
  {cols=10, row=1, zindex=1}, //an empty element

  //row 2
  {cols=0, seatNumber=1U, row=2, zindex=1},
  {cols=2, seatNumber=5U,  row=2, zindex=1},  
  {cols=4, seatNumber=13U, row=2, zindex=1}, 
  {cols=6, seatNumber=17U, row=2, zindex=1},
  {cols=8, seatNumber=25U, row=2, zindex=1},  
  {cols=10, seatNumber=D2U,row=2, zindex=1}, 

  //row 3 (just empty elements)
  {cols=0, row=3, zindex=1},
  {cols=2, row=3, zindex=1},
  {cols=4, row=3, zindex=1},
  {cols=6, row=3, zindex=1},
  {cols=8, row=3, zindex=1},
  {cols=10, row=3, zindex=1},

  //row 4
  {cols=0, seatNumber=9U, row=4, zindex=1},
  {cols=2, seatNumber=11U, row=4, zindex=1},
  {cols=4, seatNumber=21U, row=4, zindex=1}, 
  {cols=6, seatNumber=23U, row=4, zindex=1},
  {cols=8, seatNumber=29U, row=4, zindex=1},
  {cols=10, row=4, zindex=1} //an empty element
]

然后将剩下的代码修改成这样:

columnCount = computeTotalColumnCount(...); //
addEmptyElements(...); // add empty elements to your data structure (upperList or gridArray)

gridLayoutManager=new GridLayoutManager(this, columnCount, LinearLayoutManager.VERTICAL,
            false);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return 2;
        }
    });

如果你想让每个item的span-size更灵活,你应该给每个item添加一个新的参数,这样一个item看起来像这样:

{cols=0, seatNumber=2U, row=1, zindex=1, spansize=2}

您可以将 SpanSizeLookup 修改为:

gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return Integer.parseInt(upperList.get(i).get("spansize"));
        }
   });

我希望这对您有所帮助;)

关于android - Recyclerview 与 Gridlayoutmanager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31761535/

相关文章:

android - 如何在 Android 中设置布局大小占屏幕大小的百分比

java - Android:在回收 View 中获取用户在屏幕上的确切位置

java - 在 RecyclerView 中保留滚动位置

android - 如何防止RecyclerView移动项目?

android - RecyclerView 与 GridLayoutManager 插入项目错误位置

java - 在没有 OpenCv 包管理器的情况下在 Eclipse 上创建 Android OpenCV 项目

android - 有什么方法可以为Android设备选择特定的扬声器吗?

android - 将位图缩放到 80%

java - 如何使用 gridlayout 设置 OnClick android cardview 示例

android - 如何在android中使用flexboxlayoutmaanger创建类似instagram explore的布局?