RecyclerView中的多个LayoutManager

9
我用StaggeredGridLayoutManager做了一个RecyclerView,像这样:staggered。 我需要在上面添加一些TextView(就像LinearLayoutManager中的一列)。就像在上面的LinearLayoutManager和下面的StaggeredGridLayoutManager中一样。就像这样:enter image description here。 我应该如何做到这一点?感到非常困惑,请帮忙。 更新29-OCT-2015: 我结合denis_lor和mato在Span multiple columns with RecyclerView的答案中解决了这个问题。

你有没有看过这个 https://github.com/karumi/dividers ?你也可以自定义你的LayoutManager。 - Piyush
@Piyush Gupta。我会检查一下。 - nafsaka
@Piyush Gupta 看起来这是关于自定义RecyclerView分隔符的问题。可惜,不是这个问题。我不想改变分隔符。我希望上半部分是一些信息(在一列中),而内容则是交错网格2列。 - nafsaka
2个回答

7

关键在于你的适配器,你基本上依赖于viewType,然后决定要inflate什么类型的viewholderlayout。这里有一个例子:

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;
        }
    }

基本上你只需要一个适配器和2个或更多的视图持有者。如果你的适配器需要2种布局,那么你就需要使用2个视图持有者和对应的布局;否则,如果你还需要一个底部布局,你就需要使用更多的视图持有者和布局。


2
如果我使用这个,它依然会在StaggeredGridLayoutManager中,这意味着视图将会是交错的。我希望它能够像LinearLayoutManager一样(单列)。 - nafsaka
1
谢谢你的提示,我会尝试的。 - nafsaka
无法在适配器内更改LayoutManger。我将更改布局管理器的代码放入getItemViewType中。错误:尝试在空对象引用上调用虚拟方法'int android.view.View.getLayoutDirection()' - nafsaka
太好了,你解决了! :D - denis_lor

5

当滚动时,您希望发生什么?

如果顶部视图应保持可见,则可以使用一个有两个子元素的LinearLayout包装RecyclerViewTextViewRecyclerView

如果您想让它滚动出去,可以使用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;
                }
            });

有趣的提示。等一下,我会试着玩一下这个。 - nafsaka
1
这应该是被接受的答案,被接受的答案与项目大小无关。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接