【问题标题】:Multiple LayoutManager in RecyclerViewRecyclerView中的多个LayoutManager
【发布时间】:2015-10-29 20:02:56
【问题描述】:

我用 StaggeredGridLayoutManager 制作了 RecyclerView,如下所示:

我需要在它上面添加一些 TextView(像 LinearLayoutManager 中的一列)。就像上面的 LinearLayoutManager 和底部的 StaggeredGridLayoutManager。像这样的:

我怎样才能做到这一点?这里真的很困惑,请帮助。

2015 年 10 月 29 日更新:

我在这里结合denis_lor和mato的答案解决了这个问题: Span multiple columns with RecyclerView

【问题讨论】:

  • 你检查过这个github.com/karumi/dividers 吗?您也可以自定义布局管理器。
  • @Piyush Gupta。我会检查的
  • @Piyush Gupta 看起来是关于自定义 RecyclerView 分隔符。可悲的是,不是这个。我不想更改分隔符。我想要上半部分是一些信息(在一列中)和内容(在交错网格 2 列中)。

标签: android


【解决方案1】:

关键在你的adapter,你基本上是靠viewType再决定viewholderlayout是哪一种inflate。举个例子:

private static final int TYPE_FIRST_ITEM = 0;
private static final int TYPE_ITEM = 1;

...

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
   if (viewType == TYPE_FIRST_ITEM) {
      // inflate your view holder for the first item
   } else {
      // here inflate your view holder for all the other items
   }

...

@Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return TYPE_FIRST_ITEM;
        } else {
            return TYPE_ITEM;
        }
    }

所以基本上你有 1 个adapter,2 个(或更多)viewHolder,仅此而已。如果您的 adapter 应该有 2 种 layout,则使用 2 viewHolder 和布局,否则如果您还需要页脚 layout,则使用更多。

【讨论】:

  • 如果我使用它,它仍然会在 StaggeredGridLayoutManager 中,这意味着视图将交错。我希望它位于 LinearLayoutManager(一列)之类的位置。
  • 谢谢你的提示,我试试看。
  • 无法更改适配器内的 LayoutManger。我将更改布局管理器的代码放入 getItemViewType。错误:Attempt to invoke virtual method 'int android.view.View.getLayoutDirection()' on a null object reference
  • 很高兴你知道了! :D
【解决方案2】:

滚动时你想发生什么?

如果顶视图应保持可见,您可以将RecyclerViewLinearLayout 包装在一起,并带有2 个孩子:TextViewRecyclerView

如果你想让它滚出,你可以使用LayoutManager.setSpanSizeLookup,像这样:

            layoutManager.setSpanSizeLookup(new SpanSizeLookup() {

                @Override
                public int getSpanIndex(int position, int spanCount) {
                    return position % spanCount;
                }

                @Override
                public int getSpanSize(int position) {
                    if (position != 0) {
                        return layoutManager.getSpanCount();
                    }
                    return 1;
                }
            });

【讨论】:

  • 有趣的提示。等一下,我会试着玩这个。
  • 这应该是接受的答案,接受的答案与项目大小无关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多