使用GridLayoutManager实现RecyclerView中的项目

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

根据数据集中的项目数量,spanCount在1-4之间。 项目宽度根据spanCount而变化。 如果spancount为4或以上,则spanCount保留为4。

如果我有5个项目,则留下1个项目(左侧4个项目,剩下1个项目),位于屏幕的左侧,自行排列。 我希望它被集中。

我已经尝试以编程方式设置左边项目的边距,并将LinearRayouts中的recyclerView和各个项目都包裹起来,并将重心设置为居中,以及设置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> 

任何人都可以提出一个解决scheme,或给我的材料工作。

提前致谢。

Related of "使用GridLayoutManager实现RecyclerView中的项目"

答案是,当你设置GridLayoutManager的spancount时,无论你尝试做多大,它的尺寸都不会超出单个项目允许的尺寸。 该项允许使用尺寸“框”,框的大小由与GridViewLayoutManager上设置的spancount相关的recyclerview的总高度和宽度指定。 这也意味着你不能使用重力设置来将一个项目推到“盒子”之外。

项目的单元格/单元格通常按如下方式计算:如果recylerview的宽度为100dp,且spancount为2,则每个项目框/单元格的宽度将为:width / spanCount。 在这种情况下,每个盒子的宽度将为50dp(100dp / spanCountOf2)。

为了使一个物品占用全部100dp,然后居中在100dp的空间中,该物品将需要占用2个跨度,即如果宽度是100dp,并且spancount是2,则每个物品被分配50dp宽度(2个可用跨度中的1个),为了使项目占用全部100dp,您需要告诉gridLayoutManager X位置的项目占用2个spanCounts而不是1.一旦项目占据全宽,或者您希望占用的跨度数量,它可以在新定义的框中进行居中或resize(框的大小为回收站的宽度/高度,相对于其跨度数)。

要更改给定项目占用的跨度数,请在GridLayoutManager上调用setSpanSizeLookup()。 然后在setSpanSizeLookup()方法的return语句中确定要更改spanSize的项的位置,并返回希望使用的跨度的数量:

  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,可以使用重力设置将项目居中在一行的中间,如果该项目占用每行的总跨度。

但是,您可能会发现,您还必须在适配器中使用替代布局才能将物品放置到物品中间。 所以,潜力,你可能必须混合和匹配设置不同的跨度计数,并使用不同的布局,通过recyclerAdapter中的getItemViewType()方法。