最近做一个购买会员功能,其中有个RecyclenView 的选择列表,需要实现横向列表,跟九宫格类似的功能。如下图,
其中选择Recyclenview选中变高亮,分分四格就需要给recyclenview 的GridLayoutManager 画分割线,直接画是画不出竖线的,网上看了都说单独处理。然后无意在网上看到一个直接在item中添加一个外层来实现,非常巧妙。
这里是GridLayoutManager或者StaggeredGridLayoutManager 设置Item间距的办法。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="position"
type="int" />
<variable
name="listener"
type="com.xxx.listenter.OnRecyclerviewItemClickListener" />
<variable
name="buyvip"
type="com.xxx.response.BuyVipResponse.DataBean.ListBean" />
</data>
<!--外层item边距-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/lucency_3"
android:onClick="@{(thenView) ->listener.onItemClickListener(thenView, position)}"
android:orientation="vertical"
android:padding="5dp">
<!--外层item边框-->
<LinearLayout
android:id="@+id/vip_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/vip_style"
android:orientation="vertical">
<TextView
android:id="@+id/tv_class"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:gravity="center"
android:text="会员"
android:textColor="@color/randking_top" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="5dp"
android:gravity="center"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="5dp"
android:layout_marginRight="3dp"
android:gravity="bottom"
android:text="¥"
android:textColor="@color/randking_top" />
<TextView
android:id="@+id/tv_vip_money"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="99"
android:textColor="@color/randking_top"
android:textSize="20sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="5dp"
android:gravity="bottom"
android:text="元"
android:textColor="@color/randking_top" />
<com.gwkj.qixiubaodian.utils.DrawLineTextView
android:id="@+id/tv_discount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:layout_marginLeft="5dp"
android:gravity="bottom"
android:text="20"
android:textColor="@color/gray_99" />
</LinearLayout>
<TextView
android:id="@+id/vip_time"
style="@style/help_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="5dp"
android:ellipsize="end"
android:gravity="center"
android:lines="1"
android:text="7" />
</LinearLayout>
</LinearLayout>
</layout>
里面这个RelativeLayout就是你的item正常的布局,而LinearLayout 这个根部局我设置了他的背景色为透明的,再加一个padding就行了,这个padding就是设置item的间距,这样设置item的间距了。
所以说RecyclerView的Item的间距都可以通过item里面设置padding,margin来解决,这种办法相对巧妙。
然后在调用的地方,
int spanCount = 3; // 3 columns
int spacing = 50; // 50px
boolean includeEdge = false;
mRecyclerView.addItemDecoration(new GridSpacingItemDecoration(spanCount, spacing, includeEdge));
如果你了别人的RecycleView 上拉加载下拉刷新,addItemDecoration 这个方法 不一定会给你加上,你可以在源码上自行添加。
public void addItemDecoration(RecyclerView.ItemDecoration decor) {
mRecyclerView.addItemDecoration(decor,-1);
}