├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── littlejerk │ │ └── xrecyclerviewdivider │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── littlejerk │ │ │ └── xrecyclerviewdivider │ │ │ ├── GridActivity.java │ │ │ ├── LinearActivity.java │ │ │ ├── MainActivity.java │ │ │ └── StaggeredGridActivity.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xxhdpi │ │ └── icon_back_arrow_white.png │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_grid.xml │ │ ├── activity_linear.xml │ │ ├── activity_main.xml │ │ ├── activity_staggered_grid.xml │ │ ├── item_gird_horizontal_list.xml │ │ ├── item_grid_vertical_list.xml │ │ ├── item_linear_horizontal_list.xml │ │ ├── item_linear_vertical_list.xml │ │ ├── item_staggered_grid_horizontal_list.xml │ │ └── item_staggered_grid_vertical_list.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── themes.xml │ └── test │ └── java │ └── com │ └── littlejerk │ └── xrecyclerviewdivider │ └── ExampleUnitTest.java ├── art ├── app-debug.apk ├── grid_h_include_edge.jpg ├── grid_h_noinclude_edge.jpg ├── grid_v_include_edge.jpg ├── grid_v_noinclude_edge.jpg ├── linear_include_edge.jpg ├── linear_padding.jpg ├── staggeredgrid_h.jpg └── staggeredgrid_v.jpg ├── baselib ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── littlejerk │ │ └── rvdivider │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── littlejerk │ │ └── rvdivider │ │ ├── DividerHelper.java │ │ ├── builder │ │ ├── XDividerDecoration.java │ │ ├── XGridBuilder.java │ │ ├── XLinearBuilder.java │ │ └── XStaggeredGridBuilder.java │ │ └── decoration │ │ ├── ILDecoration.java │ │ └── LDecoration.java │ └── test │ └── java │ └── com │ └── littlejerk │ └── rvdivider │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | .gradle 2 | /local.properties 3 | .DS_Store # only needed under mac os 4 | /build 5 | /captures 6 | *.iml 7 | .idea 8 | *.apk #optional 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Android ReycyclerView强大的分割线-XRecyclerViewDivider 2 | [![](https://jitpack.io/v/HHotHeart/XRecyclerViewDivider.svg)](https://jitpack.io/#HHotHeart/XRecyclerViewDivider) 3 | 4 | XRecyclerViewDivider是一个功能十分强大且全面的RecyclerView 分割线库,使用建造者模式初始化Decoration,链式调用即可绘制你所需要的分割线样式,间接减少重复性代码,主要有三个建造者: 5 | [XLinearBuilder](https://github.com/HHotHeart/XRecyclerViewDivider/blob/master/baselib/src/main/java/com/littlejerk/rvdivider/builder/XLinearBuilder.java)、[XGridBuilder](https://github.com/HHotHeart/XRecyclerViewDivider/blob/master/baselib/src/main/java/com/littlejerk/rvdivider/builder/XGridBuilder.java)、[XStaggeredGridBuilder](https://github.com/HHotHeart/XRecyclerViewDivider/blob/master/baselib/src/main/java/com/littlejerk/rvdivider/builder/XStaggeredGridBuilder.java) 6 | 它们分别为LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager绘制不一样的分割线。 7 | 8 | ## 项目引入该库 9 | 10 | 在你的 Project build.gradle文件中添加: 11 | 12 | ```java 13 | allprojects { 14 | repositories { 15 | ... 16 | maven { url 'https://jitpack.io' } 17 | } 18 | } 19 | ``` 20 | 在你的 Module build.gradle文件中添加: 21 | 22 | ```java 23 | dependencies { 24 | implementation 'com.github.huangxiaolianghh:XRecyclerViewDivider:1.0.2' 25 | } 26 | ``` 27 | 28 | 29 | ## 效果图 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 |
44 | 45 | 46 | 47 | 48 | 49 | 50 |
51 | 52 | 53 | 54 | 55 | 56 | 57 |
58 | 59 | 60 | ## 功能特点 61 | 62 | ### 1.LinearLayoutManager 63 | * 支持水平竖直方向LayoutManager 64 | * 支持设置第一个item 上边距 65 | * 支持设置最后一个item的分割线 66 | * 支持space大小、分割线padding、分割线是否绘制到RecyclerView的padding 67 | * 支持设置分割线color、drawable 68 | * 支持设置不显示哪些item分割线 69 | * 支持定制某个item的分割线(包括padding、color、drawable、设置边界等) 70 | 71 | XLinearBuilder属性表格 72 | 73 | 属性| 意义 74 | -------- | ----- 75 | mSpacing| 分割线间距,默认1dp;可直接设置dp或dp对应的res 76 | mShowLastLine| 是否绘制最后一个item的分割线,默认false 77 | mShowFirstTopLine| 是否绘制第一个item上边或左边分割线,默认false 78 | mIsIncludeParentLTPadding| 分割线是否绘制RecyclerView的左或上padding部分,默认false 79 | mIsIncludeParentRBPadding| 分割线是否绘制RecyclerView的右或下padding部分,默认false 80 | mLeftPadding | mTopPadding|分割线左边距或上边距 81 | mRightPadding | mBottomPadding|分割线右边距或下边距 82 | mColor| 分割线的颜色 83 | mDividerDrawable| 分割线的drawable 84 | mOnNoDividerPosition| position分割线不绘制的回调,返回position的数组,为null不处理 85 | mOnItemDivider| 定制某条分割线的回调,返回的是LDecoration,为null不处理 86 | 87 | LDecoration主要是设置某条分割线的属性,如果设置了setPadding方法,则会把mLeftPadding、mTopPadding、mRightPadding、mBottomPadding设置,设置了mDividerDrawable会覆盖mColor,具体可看源码。 88 | 89 | 90 | 基本使用: 91 | ```java 92 | new XLinearBuilder(this) 93 | //分割线间距,支持float dp 和DimenRes dp 94 | .setSpacing(4f) 95 | .setShowFirstTopLine(true) 96 | .setShowLastLine(true) 97 | .setColor(Color.BLACK) 98 | //设置哪几个position不绘制分割线,接受数组new int[]{0,1},返回null表示不处理 99 | .setOnItemNoDivider(() -> null) 100 | //定制某一item分割线样式,可改颜色和设置边沿分割线,返回null表示不处理 101 | .setOnItemDividerDecoration(new XLinearBuilder.OnItemDivider() { 102 | @Override 103 | public LDecoration getItemDividerDecoration(int position) { 104 | if (position == 1) { 105 | return new LDecoration(LinearActivity.this) 106 | .setColor(Color.RED); 107 | 108 | } 109 | return null; 110 | } 111 | }) 112 | ; 113 | ``` 114 | 如果想全部绘制边沿分割线,可这样设置: 115 | 116 | ```java 117 | new XLinearBuilder(this) 118 | //分割线间距,支持float dp 和DimenRes dp 119 | .setSpacing(4f) 120 | .setShowFirstTopLine(true) 121 | .setShowLastLine(true) 122 | .setColor(Color.BLACK) 123 | //设置哪几个position不绘制分割线,接受数组new int[]{0,1},返回null表示不处理 124 | .setOnItemNoDivider(() -> null) 125 | //定制某一item分割线样式,可改颜色和设置边沿分割线,返回null表示不处理 126 | .setOnItemDividerDecoration(new XLinearBuilder.OnItemDivider() { 127 | @Override 128 | public LDecoration getItemDividerDecoration(int position) { 129 | return new LDecoration(LinearActivity.this) 130 | .setAroundEdge(true, null, true, null) 131 | .setColor(Color.RED); 132 | 133 | 134 | } 135 | }); 136 | ``` 137 | 具体还有很多功能,可clone下来,自己去体验。 138 | 139 | ### 2.GridLayoutManager 140 | 141 | * 支持水平竖直方向GridLayoutManager 142 | * 支持设置是否显示边界 143 | * 可分别设置水平方向和竖直方向的space、color、drawable等 144 | * 支持SpanSizeLookup(不规则的Grid) 145 | * 支持设置横竖交叉处的归属(属于竖向或横向) 146 | 147 | XGridBuilder属性表格 148 | 149 | 属性| 意义 150 | -------- | ----- 151 | mSpacing| 分割线间距,默认0dp;可直接设置dp或dp对应的res 152 | mVLineSpacing| 竖直线的间距,默认0dp,会覆盖mSpacing 153 | mHLineSpacing| 水平线的间距,默认0dp,会覆盖mSpacing 154 | mIsIncludeEdge| 是否绘制边界,默认false 155 | mVerticalIncludeEdge| 分割线交叉处是否属于竖直线的部分,默认false 156 | mVLineColor|竖直分割线颜色 157 | mHLineColor|水平分割线颜色 158 | mColor| 分割线的颜色,会被mVLineColor或mHLineColor覆盖 159 | mVLineDividerDrawable| 竖直分割线的drawable 160 | mHLineDividerDrawable| 水平分割线的drawable 161 | mDividerDrawable| 分割线的drawable,会被mVLineDividerDrawable或mHLineDividerDrawable覆盖 162 | 163 | 基本使用: 164 | 165 | ```java 166 | new XGridBuilder(this) 167 | //分割线间距,支持float dp 和DimenRes dp 168 | .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明 169 | .setVLineSpacing(4f) 170 | .setHLineSpacing(8f) 171 | //这几个color和drawable的优先级可看XGridBuilder说明 172 | .setColor(Color.BLUE) 173 | //可设置颜色和drawable,drawable>color 174 | // .setColorRes(R.color.white) 175 | // .setDrawable(new ColorDrawable(Color.WHITE)) 176 | // .setDrawableRes(R.drawable.) 177 | .setHLineColor(Color.BLACK) 178 | // .setHLineDrawable() 179 | .setVLineColor(Color.RED) 180 | // .setVLineDrawable() 181 | //是否包括边界 182 | .setIncludeEdge(true) 183 | //竖直和水平分割线交叉处绘制的是竖直分割线颜色(交叉处属于竖直分割线) 184 | .setVerticalIncludeEdge(true) 185 | ; 186 | ``` 187 | 188 | ### 3.StaggeredGridLayoutManager 189 | * 支持水平竖直方向StaggeredGridLayoutManager 190 | * 支持设置是否显示边界 191 | * 可设置水平方向和竖直方向的space、不支持color、drawable(基本不用) 192 | * 支持设置FullSpan情况 193 | 194 | XStaggeredGridBuilder属性表格 195 | 196 | 属性| 意义 197 | -------- | ----- 198 | mSpacing| 分割线间距,默认0dp;可直接设置dp或dp对应的res 199 | mVLineSpacing| 竖直线的间距,默认0dp,会覆盖mSpacing 200 | mHLineSpacing| 水平线的间距,默认0dp,会覆盖mSpacing 201 | mIsIncludeEdge| 是否绘制边界,默认false 202 | mIsIgnoreFullSpan| 边界绘制是否忽略FullSpan的情况,默认false 203 | 204 | 205 | 基本使用: 206 | 207 | ```java 208 | new XStaggeredGridBuilder(this) 209 | //分割线间距,支持float dp 和DimenRes dp 210 | .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明 211 | .setVLineSpacing(4f) 212 | .setHLineSpacing(8f) 213 | //是否包括边界 214 | .setIncludeEdge(true) 215 | //是否忽略FullSpan的情况 216 | .setIgnoreFullSpan(true) 217 | ; 218 | ``` 219 | 220 | 感谢:[ByRecyclerView](https://github.com/youlookwhat/ByRecyclerView),采纳了其对FullSpan处理的一些思想。 221 | 222 | ## 结语 223 | 224 | 使用中有问题或没有实现的功能都可以反馈给我,我一定会尽量满足大家的需求。希望这个库能够帮到大家,欢迎star~。 225 | 226 | [文章博客](https://blog.csdn.net/HHHceo/article/details/117453495) -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | } 4 | 5 | android { 6 | compileSdkVersion 30 7 | 8 | defaultConfig { 9 | applicationId "com.littlejerk.xrecyclerviewdivider" 10 | minSdkVersion 21 11 | targetSdkVersion 30 12 | versionCode 1 13 | versionName "1.0" 14 | 15 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 16 | } 17 | 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | compileOptions { 25 | sourceCompatibility JavaVersion.VERSION_1_8 26 | targetCompatibility JavaVersion.VERSION_1_8 27 | } 28 | } 29 | 30 | dependencies { 31 | 32 | implementation 'androidx.appcompat:appcompat:1.2.0' 33 | implementation 'com.google.android.material:material:1.2.1' 34 | implementation 'androidx.constraintlayout:constraintlayout:2.0.1' 35 | implementation project(path: ':baselib') 36 | testImplementation 'junit:junit:4.+' 37 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 38 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 39 | implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4' 40 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/androidTest/java/com/littlejerk/xrecyclerviewdivider/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.littlejerk.xrecyclerviewdivider; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | assertEquals("com.littlejerk.xrecyclerviewdivider", appContext.getPackageName()); 25 | } 26 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/src/main/java/com/littlejerk/xrecyclerviewdivider/GridActivity.java: -------------------------------------------------------------------------------- 1 | package com.littlejerk.xrecyclerviewdivider; 2 | 3 | import android.graphics.Color; 4 | import android.os.Bundle; 5 | import android.widget.RadioButton; 6 | 7 | import androidx.appcompat.app.AppCompatActivity; 8 | import androidx.recyclerview.widget.GridLayoutManager; 9 | import androidx.recyclerview.widget.RecyclerView; 10 | 11 | import com.chad.library.adapter.base.BaseQuickAdapter; 12 | import com.chad.library.adapter.base.viewholder.BaseViewHolder; 13 | import com.littlejerk.rvdivider.builder.XGridBuilder; 14 | 15 | import org.jetbrains.annotations.NotNull; 16 | import org.jetbrains.annotations.Nullable; 17 | 18 | import java.util.Arrays; 19 | import java.util.List; 20 | 21 | public class GridActivity extends AppCompatActivity { 22 | 23 | private GridAdapter mAdapter; 24 | private GridLayoutManager mManager; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.activity_grid); 30 | 31 | findViewById(R.id.iv_back).setOnClickListener(mView -> onBackPressed()); 32 | RadioButton rb_v = findViewById(R.id.rb_v); 33 | RadioButton rb_h = findViewById(R.id.rb_h); 34 | RecyclerView recyclerView = findViewById(R.id.recycler_view); 35 | 36 | rb_v.setOnCheckedChangeListener((mCompoundButton, mB) -> { 37 | if (mB) { 38 | deleteItemDivider(recyclerView); 39 | mManager = new GridLayoutManager(this, 4, RecyclerView.VERTICAL, false); 40 | recyclerView.setLayoutManager(mManager); 41 | recyclerView.addItemDecoration(bindXGrid().build()); 42 | mAdapter = new GridAdapter(R.layout.item_grid_vertical_list, getData()); 43 | recyclerView.setAdapter(mAdapter); 44 | } 45 | }); 46 | rb_h.setOnCheckedChangeListener((mCompoundButton, mB) -> { 47 | if (mB) { 48 | deleteItemDivider(recyclerView); 49 | mManager = new GridLayoutManager(this, 4, RecyclerView.HORIZONTAL, false); 50 | recyclerView.setLayoutManager(mManager); 51 | recyclerView.addItemDecoration(bindXGrid().build()); 52 | mAdapter = new GridAdapter(R.layout.item_gird_horizontal_list, getData()); 53 | recyclerView.setAdapter(mAdapter); 54 | } 55 | }); 56 | 57 | rb_v.setChecked(true); 58 | 59 | } 60 | 61 | /** 62 | * 线性构造器 63 | * 64 | * @return 65 | */ 66 | public XGridBuilder bindXGrid() { 67 | return new XGridBuilder(this) 68 | //分割线间距,支持float dp 和DimenRes dp 69 | .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明 70 | .setVLineSpacing(4f) 71 | .setHLineSpacing(8f) 72 | //这几个color和drawable的优先级可看XGridBuilder说明 73 | .setColor(Color.BLUE) 74 | //可设置颜色和drawable,drawable>color 75 | // .setColorRes(R.color.white) 76 | // .setDrawable(new ColorDrawable(Color.WHITE)) 77 | // .setDrawableRes(R.drawable.) 78 | .setHLineColor(Color.BLACK) 79 | // .setHLineDrawable() 80 | .setVLineColor(Color.RED) 81 | // .setVLineDrawable() 82 | //是否包括边界 83 | .setIncludeEdge(true) 84 | //竖直和水平分割线交叉处绘制的是竖直分割线颜色(交叉处属于竖直分割线) 85 | .setVerticalIncludeEdge(true) 86 | ; 87 | } 88 | 89 | /** 90 | * 重新设置分割线时,需删除之前的分割线 91 | * 92 | * @param recyclerView 93 | */ 94 | public void deleteItemDivider(RecyclerView recyclerView) { 95 | for (int i = 0; i < recyclerView.getItemDecorationCount(); i++) { 96 | recyclerView.removeItemDecoration(recyclerView.getItemDecorationAt(i)); 97 | } 98 | } 99 | 100 | 101 | public static class GridAdapter extends BaseQuickAdapter { 102 | 103 | public GridAdapter(int layoutResId, @Nullable List data) { 104 | super(layoutResId, data); 105 | } 106 | 107 | @Override 108 | protected void convert(@NotNull BaseViewHolder holder, String mS) { 109 | 110 | } 111 | } 112 | 113 | 114 | public List getData() { 115 | return Arrays.asList("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"); 116 | } 117 | 118 | } -------------------------------------------------------------------------------- /app/src/main/java/com/littlejerk/xrecyclerviewdivider/LinearActivity.java: -------------------------------------------------------------------------------- 1 | package com.littlejerk.xrecyclerviewdivider; 2 | 3 | import android.os.Bundle; 4 | import android.widget.RadioButton; 5 | 6 | import com.chad.library.adapter.base.BaseQuickAdapter; 7 | import com.chad.library.adapter.base.viewholder.BaseViewHolder; 8 | import com.littlejerk.rvdivider.builder.XLinearBuilder; 9 | import com.littlejerk.rvdivider.decoration.LDecoration; 10 | 11 | import org.jetbrains.annotations.NotNull; 12 | import org.jetbrains.annotations.Nullable; 13 | 14 | import java.util.Arrays; 15 | import java.util.List; 16 | 17 | import androidx.appcompat.app.AppCompatActivity; 18 | import androidx.recyclerview.widget.LinearLayoutManager; 19 | import androidx.recyclerview.widget.RecyclerView; 20 | 21 | public class LinearActivity extends AppCompatActivity { 22 | 23 | private LinearAdapter mAdapter; 24 | private LinearLayoutManager mManager; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.activity_linear); 30 | 31 | findViewById(R.id.iv_back).setOnClickListener(mView -> onBackPressed()); 32 | RadioButton rb_v = findViewById(R.id.rb_v); 33 | RadioButton rb_h = findViewById(R.id.rb_h); 34 | RecyclerView recyclerView = findViewById(R.id.recycler_view); 35 | 36 | rb_v.setOnCheckedChangeListener((mCompoundButton, mB) -> { 37 | if (mB) { 38 | deleteItemDivider(recyclerView); 39 | mManager = new LinearLayoutManager(this); 40 | recyclerView.setLayoutManager(mManager); 41 | recyclerView.addItemDecoration(bindXLinear().build()); 42 | mAdapter = new LinearAdapter(R.layout.item_linear_vertical_list, getData()); 43 | recyclerView.setAdapter(mAdapter); 44 | } 45 | }); 46 | rb_h.setOnCheckedChangeListener((mCompoundButton, mB) -> { 47 | if (mB) { 48 | deleteItemDivider(recyclerView); 49 | mManager = new LinearLayoutManager(this, RecyclerView.HORIZONTAL, false); 50 | recyclerView.setLayoutManager(mManager); 51 | recyclerView.addItemDecoration(bindXLinear().build()); 52 | mAdapter = new LinearAdapter(R.layout.item_linear_horizontal_list, getData()); 53 | recyclerView.setAdapter(mAdapter); 54 | } 55 | }); 56 | 57 | rb_v.setChecked(true); 58 | 59 | } 60 | 61 | /** 62 | * 线性构造器 63 | * 64 | * @return 65 | */ 66 | public XLinearBuilder bindXLinear() { 67 | return new XLinearBuilder(this) 68 | //分割线间距,支持float dp 和DimenRes dp 69 | .setSpacing(2f) 70 | .setShowFirstTopLine(true) 71 | .setShowLastLine(true) 72 | // .setColor(Color.BLACK) 73 | //可设置颜色和drawable,drawable>color 74 | // .setColorRes(R.color.white) 75 | // .setDrawable(new ColorDrawable(Color.WHITE)) 76 | // .setDrawableRes(R.drawable.) 77 | //是否包含RecyclerView的padding,分为左右(竖直),上下(水平) 78 | .setIncludeParentHVPadding(false, false) 79 | //设置item分割线的padding,分为左右(竖直),上下(水平) 80 | .setPadding(4f) 81 | // .setLeftPadding(4f) 82 | // .setRightPadding(4f) 83 | // .setTopPadding(4f) 84 | // .setBottomPadding(4f) 85 | //设置哪几个position不绘制分割线,接受数组new int[]{0,1},返回null表示不处理 86 | .setOnItemNoDivider(() -> null) 87 | //定制某一item分割线样式,可改颜色和设置边沿分割线,返回null表示不处理 88 | .setOnItemDividerDecoration(new XLinearBuilder.OnItemDivider() { 89 | @Override 90 | public LDecoration getItemDividerDecoration(int position) { 91 | // if(position == 1){ 92 | // return new LDecoration(LinearActivity.this) 93 | // //竖直 94 | // .setAroundEdge(true,null,true,null) 95 | // //水平 96 | // .setAroundEdge(null,true,null,true) 97 | // 98 | // //设置drawable和上面一样(针对某一条分割线) 99 | // .setColor(Color.RED) 100 | // //设置padding和上面一样 101 | // .setPadding(10f); 102 | // 103 | // } 104 | return null; 105 | } 106 | }) 107 | ; 108 | } 109 | 110 | /** 111 | * 重新设置分割线时,需删除之前的分割线 112 | * 113 | * @param recyclerView 114 | */ 115 | public void deleteItemDivider(RecyclerView recyclerView) { 116 | for (int i = 0; i < recyclerView.getItemDecorationCount(); i++) { 117 | recyclerView.removeItemDecoration(recyclerView.getItemDecorationAt(i)); 118 | } 119 | } 120 | 121 | 122 | public static class LinearAdapter extends BaseQuickAdapter { 123 | 124 | public LinearAdapter(int layoutResId, @Nullable List data) { 125 | super(layoutResId, data); 126 | } 127 | 128 | @Override 129 | protected void convert(@NotNull BaseViewHolder holder, String mS) { 130 | 131 | } 132 | } 133 | 134 | 135 | public List getData() { 136 | return Arrays.asList("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"); 137 | } 138 | 139 | 140 | } -------------------------------------------------------------------------------- /app/src/main/java/com/littlejerk/xrecyclerviewdivider/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.littlejerk.xrecyclerviewdivider; 2 | 3 | import android.content.Intent; 4 | import android.os.Bundle; 5 | 6 | import androidx.appcompat.app.AppCompatActivity; 7 | 8 | import static com.littlejerk.xrecyclerviewdivider.R.id.btn_StaggeredGridLayoutManager; 9 | 10 | public class MainActivity extends AppCompatActivity { 11 | 12 | @Override 13 | protected void onCreate(Bundle savedInstanceState) { 14 | super.onCreate(savedInstanceState); 15 | setContentView(R.layout.activity_main); 16 | 17 | findViewById(R.id.btn_LinearLayoutManager).setOnClickListener(v -> { 18 | startActivity(new Intent(MainActivity.this, LinearActivity.class)); 19 | }); 20 | 21 | findViewById(R.id.btn_GridLayoutManager).setOnClickListener(v -> { 22 | startActivity(new Intent(MainActivity.this, GridActivity.class)); 23 | 24 | }); 25 | 26 | findViewById(btn_StaggeredGridLayoutManager).setOnClickListener(v -> { 27 | startActivity(new Intent(MainActivity.this, StaggeredGridActivity.class)); 28 | 29 | }); 30 | 31 | } 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/littlejerk/xrecyclerviewdivider/StaggeredGridActivity.java: -------------------------------------------------------------------------------- 1 | package com.littlejerk.xrecyclerviewdivider; 2 | 3 | import android.os.Bundle; 4 | import android.view.ViewGroup; 5 | import android.widget.RadioButton; 6 | import android.widget.TextView; 7 | 8 | import androidx.appcompat.app.AppCompatActivity; 9 | import androidx.recyclerview.widget.RecyclerView; 10 | import androidx.recyclerview.widget.StaggeredGridLayoutManager; 11 | 12 | import com.chad.library.adapter.base.BaseQuickAdapter; 13 | import com.chad.library.adapter.base.viewholder.BaseViewHolder; 14 | import com.littlejerk.rvdivider.DividerHelper; 15 | import com.littlejerk.rvdivider.builder.XStaggeredGridBuilder; 16 | 17 | import org.jetbrains.annotations.NotNull; 18 | import org.jetbrains.annotations.Nullable; 19 | 20 | import java.util.Arrays; 21 | import java.util.List; 22 | 23 | public class StaggeredGridActivity extends AppCompatActivity { 24 | 25 | private StaggeredGridAdapter mAdapter; 26 | private StaggeredGridLayoutManager mManager; 27 | 28 | @Override 29 | protected void onCreate(Bundle savedInstanceState) { 30 | super.onCreate(savedInstanceState); 31 | setContentView(R.layout.activity_staggered_grid); 32 | findViewById(R.id.iv_back).setOnClickListener(mView -> onBackPressed()); 33 | RadioButton rb_v = findViewById(R.id.rb_v); 34 | RadioButton rb_h = findViewById(R.id.rb_h); 35 | RecyclerView recyclerView = findViewById(R.id.recycler_view); 36 | 37 | rb_v.setOnCheckedChangeListener((mCompoundButton, mB) -> { 38 | if (mB) { 39 | deleteItemDivider(recyclerView); 40 | mManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL); 41 | recyclerView.setLayoutManager(mManager); 42 | recyclerView.addItemDecoration(bindXStaggeredGrid().build()); 43 | mAdapter = new StaggeredGridAdapter(R.layout.item_grid_vertical_list, getData()); 44 | recyclerView.setAdapter(mAdapter); 45 | } 46 | }); 47 | rb_h.setOnCheckedChangeListener((mCompoundButton, mB) -> { 48 | if (mB) { 49 | deleteItemDivider(recyclerView); 50 | mManager = new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL); 51 | recyclerView.setLayoutManager(mManager); 52 | recyclerView.addItemDecoration(bindXStaggeredGrid().build()); 53 | mAdapter = new StaggeredGridAdapter(R.layout.item_gird_horizontal_list, getData()); 54 | recyclerView.setAdapter(mAdapter); 55 | } 56 | }); 57 | 58 | rb_v.setChecked(true); 59 | 60 | } 61 | 62 | /** 63 | * 线性构造器 64 | * 65 | * @return 66 | */ 67 | public XStaggeredGridBuilder bindXStaggeredGrid() { 68 | return new XStaggeredGridBuilder(this) 69 | //分割线间距,支持float dp 和DimenRes dp 70 | .setSpacing(2f)//这几个Spacing的优先级可看XGridBuilder说明 71 | .setVLineSpacing(4f) 72 | .setHLineSpacing(8f) 73 | //是否包括边界 74 | .setIncludeEdge(true) 75 | //是否忽略FullSpan的情况 76 | .setIgnoreFullSpan(true) 77 | ; 78 | } 79 | 80 | /** 81 | * 重新设置分割线时,需删除之前的分割线 82 | * 83 | * @param recyclerView 84 | */ 85 | public void deleteItemDivider(RecyclerView recyclerView) { 86 | for (int i = 0; i < recyclerView.getItemDecorationCount(); i++) { 87 | recyclerView.removeItemDecoration(recyclerView.getItemDecorationAt(i)); 88 | } 89 | } 90 | 91 | 92 | public static class StaggeredGridAdapter extends BaseQuickAdapter { 93 | 94 | public StaggeredGridAdapter(int layoutResId, @Nullable List data) { 95 | super(layoutResId, data); 96 | } 97 | 98 | @Override 99 | protected void convert(@NotNull BaseViewHolder holder, String mS) { 100 | TextView textView = holder.getView(R.id.tv_name); 101 | if (holder.getAdapterPosition() < 3) { 102 | ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); 103 | if (lp instanceof StaggeredGridLayoutManager.LayoutParams) { 104 | StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; 105 | p.setFullSpan(true); 106 | } 107 | 108 | } else { 109 | if (holder.getAdapterPosition() % 2 == 0) { 110 | ViewGroup.LayoutParams params = textView.getLayoutParams(); 111 | //设置图片的相对于屏幕的宽高比 112 | params.width = DividerHelper.dp2px(150); 113 | params.height = DividerHelper.dp2px(100); 114 | textView.setLayoutParams(params); 115 | } 116 | } 117 | } 118 | } 119 | 120 | 121 | public List getData() { 122 | return Arrays.asList("1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1", "1"); 123 | } 124 | 125 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xxhdpi/icon_back_arrow_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huangxiaolianghh/XRecyclerViewDivider/06034c59b03ee8dcda476c8580f2d1d5228a22df/app/src/main/res/drawable-xxhdpi/icon_back_arrow_white.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_grid.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 22 | 23 | 32 | 33 | 34 | 35 | 40 | 46 | 52 | 53 | 54 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_linear.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 | 22 | 23 | 32 | 33 | 34 | 35 | 40 | 46 | 52 | 53 | 54 | 58 | 59 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 17 | 18 | 19 | 24 | 25 |