我将RecyclerViewGridLayout管理器结合使用,可以使座位预订布局像旅行一样。

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

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

这是我想要的理想布局:

android - 带有Gridlayout Manager的回收者 View-LMLPHP

...但是我目前正在得到这样的东西:

android - 带有Gridlayout Manager的回收者 View-LMLPHP

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

    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,因此每个项目的Span大小为2,最大Span索引为11。因此,您的span-count应该为12(表示从0到11)。

现在,您必须找出空白处。例如。第3行完全没有任何项目,根据您的数据,第1行和第4行的末尾都有一个空元素。因此,您应该定义一个空项目(-> viewtype!),该空项目表示布局中的空白。

最后,按照项目的行索引和列索引对项目列表进行排序,以实现以下结构:

[ //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;
        }
    });

如果要使每个项目的跨度大小更灵活,则应向每个项目添加一个新参数,以便使一个项目如下所示:
{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"));
        }
   });

我希望这有帮助 ;)

10-05 23:13