使用GridLayoutManager实现RecyclerView时如何使项目居中

11

我有一个使用GridLayoutManager实现的RecyclerView。

根据数据集中的项目数量,spanCount在1-4之间。项目的宽度取决于spanCount。如果spanCount为4或以上,则保持为4。

如果我有5个项目,这将留下1个项目(一行4个项目,1个项目剩余),位于屏幕左侧,独自占据一行。我希望它居中。

我尝试通过编程方式设置剩余项目的边距,并将recyclerView和单个项目都包装在LinearLayout中,并将重力设置为center,以及设置recyclerView的重力。

示例项目XML:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="horizontal"

    >


    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:id="@+id/relative"
        /> 

</LinearLayout>

示例 RecyclerView XML

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:orientation="horizontal"
            >
           <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"

            />

        </LinearLayout>

有人可以提供解决方案或者给我一些参考资料吗?

先在这里谢谢了。

1个回答

13
这个问题的答案是:当你设置GridLayoutManager的spancount时,每个项目无论你尝试多么大,它都不会超过单个项目允许的尺寸。这个允许的尺寸“盒子”就是项目的单元格,盒子的大小由recyclerview的总高度和宽度与GridLayoutManager上设置的spancount相对关系来指定。这也意味着你不能使用gravity设置来将项目推出其“盒子”。
项目的盒子/单元格通常计算如下:如果recylerview的宽度为100dp,而spancount为2,则每个项目的盒子/单元格宽度为:width/spanCount。在这种情况下,每个盒子的宽度为50dp(100dp/spanCountOf2)。
为了使一个项目占据整个100dp,并在100dp的空间中居中,该项目必须占据2个spancounts,例如,如果宽度为100dp,spancount为2,则每个项目被分配50dp的宽度(其中1个可用的spancount),要使该项占据全部100dp,你需要告诉gridLayoutManager X位置的项目占据2个spanCounts而不是1个。一旦项目占据了全宽或你想要占据的跨度数量,它可以在其新定义的盒子内居中或调整大小(盒子大小是recycler的宽度/高度与其spancount的关系)。
要更改给定项目占据的跨度数量,请在GridLayoutManager上调用setSpanSizeLookup()。然后识别你想要更改跨度大小的项目的位置,并在setSpanSizeLookup()方法的返回语句中返回你想要使用的跨度数量。
 gridlayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
                @Override
                public int getSpanSize(int position) {
                    if (position == 1) {
                        return 4; // the item in position now takes up 4 spans
                    }
                    return 1;
                }
            });
        }

通过改变项目的spanCount,您可以使用重力设置将项目居中在一行的中间位置,如果该项目占据每行的总spancount。

但是,您可能会发现还需要在适配器中使用替代布局来使项目居中。因此,您可能需要混合和匹配不同的span counts设置和使用getItemViewType()方法在RecyclerAdapter中使用不同的布局。


1
讲解得非常清楚! - NightFury

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