【问题标题】:How to reflow items in a RecyclerView with the StaggeredGridLayoutManager如何使用 StaggeredGridLayoutManager 重排 RecyclerView 中的项目
【发布时间】:2014-11-11 01:30:06
【问题描述】:

我正在使用 StaggeredGridLayoutManager 并有一些接近我想要的东西。我有一个 2 行的水平交错网格,其中一些项目是 1 行的高度,而其他项目跨越两行。我希望单行高度项目堆叠起来,我认为可以通过将间隙策略设置为 GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS 来实现,但这似乎不起作用。

当前:

___ ___ ___ ___ |___| | | |___| | | | | | | |___| |___|

我想要什么:

___ ___ ___ |___| | | | | ___ | | | | |___| |___| |___|

相关代码sn-ps:

为recyclerview设置布局管理器:

StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL);
layoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_MOVE_ITEMS_BETWEEN_SPANS);
recyclerView.setLayoutManager(layoutManager);

这是我的自定义适配器的 onBindViewHolder(这只是一个简化的示例)。基本上我在 CardView 中有一个 ImageView(CardView 设置为 wrap_content 的高度和宽度)。

if(position%3==0) {
    ViewGroup.LayoutParams layoutParams = viewHolder.myImage.getLayoutParams();
    layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, context.getResources().getDisplayMetrics());
    layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 75, context.getResources().getDisplayMetrics());
    viewHolder.myImage.setLayoutParams(layoutParams);

    StaggeredGridLayoutManager.LayoutParams layoutParams1 = ((StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams());
    layoutParams1.setFullSpan(false);
}
else {
    ViewGroup.LayoutParams layoutParams = viewHolder.myImage.getLayoutParams();
    layoutParams.width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, context.getResources().getDisplayMetrics());
    layoutParams.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, context.getResources().getDisplayMetrics());
    viewHolder.myImage.setLayoutParams(layoutParams);

    StaggeredGridLayoutManager.LayoutParams layoutParams1 = ((StaggeredGridLayoutManager.LayoutParams) viewHolder.itemView.getLayoutParams());
    layoutParams1.setFullSpan(true);
}

【问题讨论】:

  • 如何使这种布局的项目跨越两行? - 我目前正在尝试通过垂直滚动来实现这一点 - 2 列,其中第一项应表示跨越两列的“标题”。
  • 啊!没关系。它是 [layoutParams.setFullSpan(true)]
  • 在 onBindViewHolder 上执行此操作很重要,因为这是视图应用了 StaggeredGridLayoutManager.LayoutParams 的第一个位置。虽然,这很奇怪……那个方法应该只用于绑定。

标签: android android-recyclerview staggered-gridview


【解决方案1】:

这样做不需要考虑适配器中项目的位置,这几乎是不需要的。您最好的选择是重新订购适配器中的项目

【讨论】:

    【解决方案2】:

    也许我错了(目前还没有关于此的好的文档),但我认为您无法使用此布局管理器实现这一目标。交错布局管理器允许您将视图放置在跨度内,如果您放置一个占据所有跨度的视图,它将根据当前视图计算下一个视图的位置(不查看前一个视图)。

    换句话说,如果你放置一个占据所有 span 的 view,布局管理器会为下一个 view 找到最短的 span,并且因为你用同一个 view 占据了所有这些 span,所以第一个 span 就是候选.

    希望对你有帮助!

    【讨论】:

    • 是的,我希望我可能只是错过了一些基于目前可用的有限文档的东西。感谢您的回复!
    【解决方案3】:

    您想要实现的目标完全可以使用 GridLayoiutManager 而不是 StaggerdLayoutmanager。 在这里,我会按如下方式使用 Gridlayoutmanager。

     mGridLayoutManager = new GridLayoutManager(mContext,2,GridLayoutManager.HORIZONTAL,false);
    mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    if(position==0 && position ==1){
                        return 1;
                    }else {
                        return 2;
                    }
                }
            });
    

    【讨论】:

    • 试试这个,我用gridlayout manager的这个api来创建异构布局。
    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多