【问题标题】:Add vertical columns in horizontal RecyclerView在水平 RecyclerView 中添加垂直列
【发布时间】:2015-04-14 12:03:24
【问题描述】:

我在我的项目上创建了一个RecyclerView 水平。我希望有不同大小的水平行和多个垂直列,每个包含不同数量的行,如下图:

水平行数是可变的。第一列可以有四行,第二列可以有三,四……列数也是可变的。

结果就像一个电视指南,列是频道,行是发射。只是这不是电视 xD 的指南

我已经用这种方式完成了水平行:

LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

recyclerView.setLayoutManager(layoutManager);


public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.VerticalItemHolder>{

    @Override
    public void onBindViewHolder(VerticalItemHolder itemHolder, int position) {
        Item item = arrayItems.get(position);    

        int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, item.getSizeRow(), root.getResources().getDisplayMetrics());

        ViewGroup.LayoutParams params = root.getLayoutParams();
        if (params == null) {
            params = new ViewGroup.LayoutParams(heigth, width);
        } else {
            params.width = width;
            params.height = heigth;
        }

        root.setLayoutParams(params);
    }

结果如下图:

但我无法让某些项目显示在垂直列中。它是如何完成的?谢谢

【问题讨论】:

  • 你不能在垂直线性布局中添加多个水平回收器视图吗?
  • 水平回收站视图无法添加垂直列。我换了图片方便提问
  • 当然,你需要设置layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  • 你只需使用 layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);对于每个回收站视图并将它们添加到垂直线性布局。我已经这样做了。最佳做法是将回收器视图放入自定义视图中,这样您就可以简化添加过程。
  • 哦,我错了,你的行和列文本切换了吗?

标签: android adapter android-recyclerview


【解决方案1】:

here 回答在RecyclerView 中使用Variable span size

使用GridLayoutManager 代替LinearLayoutManager,如下所示:

GridLayoutManager manager = new GridLayoutManager(this, 3);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
  @Override
  public int getSpanSize(int position) {
    return (3 - position % 3);
  }
});
recyclerView.setLayoutManager(manager);

在这里,我必须解释几件事。见下图-

  1. 在上面的代码中,span size是3,意思是你想要的任何一行的最大列数是3。

  2. 在上面的代码中,方法getSpanSize返回position的跨度大小。

以上代码的跨度大小:

  1. 如果位置为 0,则跨度大小为 3
  2. 如果位置为 1,则跨度大小为 2
  3. 如果位置为 2,则跨度大小为 1
  4. 如果位置为 3,则跨度大小为 3
  5. 如果位置为 4,则跨度大小为 2
  6. 如果位置为 5,则跨度大小为 1 ...等等。

如果你明白这一点,它可能会帮助你。

【讨论】:

  • 谢谢,我编辑了添加信息的问题。我的应用程序就像时间表电视指南。我可以用 gridview 做类似的事情吗?
  • 根据您更新的问题,您应该遵循此答案。检查一次是否符合您的要求。