如何使用StaggeredGridLayoutManager重排RecyclerView中的项目

时间:2014-11-11 01:30:07

标签: android android-recyclerview staggered-gridview

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

电流:

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

我想要的是什么:

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

相关代码片段:

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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

换句话说,如果放置占据所有跨度的视图,布局管理器将找到下一个视图的最短跨度,并且因为您使用相同视图占用了所有跨度,所以第一个跨度是候选

我希望这可以帮到你!

答案 2 :(得分:0)

使用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;
                }
            }
        });
相关问题