解決RecycleView分割線不居中的三種方法
本文為大家分享了三種RecycleView分割線不居中的解決方法,供大家參考,具體內(nèi)容和如下
方法一:
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int mSpace;
private int mSpanCount; // RecyclerView有多少列
private boolean mHasPadding; // RecyclerView是否有Padding
public SpacesItemDecoration(int mSpace) {
this.mSpace = mSpace;
this.mHasPadding = true;
}
public SpacesItemDecoration(int mSpace, boolean hasPadding) {
this.mSpace = mSpace;
this.mHasPadding = hasPadding;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
// 初始化列數(shù)
if (mSpanCount == 0) {
this.mSpanCount = ((GridLayoutManager) parent.getLayoutManager()).getSpanCount();
}
int position = parent.getChildAdapterPosition(view); // item position
int column = position % mSpanCount; // item column
if (mHasPadding) {
outRect.left = mSpace - column * mSpace / mSpanCount; // spacing - column * ((1f / spanCount) * spacing)
outRect.right = (column + 1) * mSpace / mSpanCount; // (column + 1) * ((1f / spanCount) * spacing)
if (position < mSpanCount) { // top edge
outRect.top = mSpace;
}
outRect.bottom = mSpace; // item bottom
} else {
outRect.left = column * mSpace / mSpanCount; // column * ((1f / spanCount) * spacing)
outRect.right = mSpace - (column + 1) * mSpace / mSpanCount; // spacing - (column + 1) * ((1f / spanCount) * spacing)
if (position >= mSpanCount) {
outRect.top = mSpace; // item top
}
}
}
public void setHasPadding(boolean hasPadding) {
this.mHasPadding = hasPadding;
}
}
方法二:
public class MutiItemDecoration extends RecyclerView.ItemDecoration {
public enum Type {
VERTICAL, HORIZONTAL, ALL
}
private Type type;//分割線類型
private int dividerSize = 10;//分割線尺寸
public MutiItemDecoration(MutiItemDecoration.Type type, int dividerSize) {
this.type = type;
this.dividerSize = dividerSize;
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
switch (type) {
case ALL:
if (itemPosition % spanCount == 0) {//第一列
if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
outRect.set(0, 0, dividerSize / 2, 0);
} else {
outRect.set(0, 0, dividerSize / 2, dividerSize);
}
} else if (itemPosition % spanCount == spanCount - 1) {//最后一列
if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
outRect.set(dividerSize / 2, 0, 0, 0);
} else {
outRect.set(dividerSize / 2, 0, 0, dividerSize);
}
} else {//中間列
if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
outRect.set(dividerSize / 2, 0, dividerSize / 2, 0);
} else {
outRect.set(dividerSize / 2, 0, dividerSize / 2, dividerSize);
}
}
break;
case VERTICAL:
if (isLastRaw(parent, itemPosition, spanCount, childCount)) {
outRect.set(0, 0, 0, 0);
} else {
outRect.set(0, 0, 0, dividerSize);
}
break;
case HORIZONTAL:
if (isLastColum(parent, itemPosition, spanCount, childCount)) {
outRect.set(0, 0, 0, 0);
} else {
outRect.set(0, 0, dividerSize, 0);
}
break;
}
}
// 是否是最后一列
private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
if ((pos + 1) % spanCount == 0)
return true;
} else {
if (pos == childCount - 1)
return true;
}
return false;
}
// 是否是最后一行
private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
childCount = childCount - childCount % spanCount;
if (pos >= childCount)
return true;
} else {
if (pos == childCount - 1)
return true;
}
return false;
}
//返回列數(shù)
private int getSpanCount(RecyclerView parent) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
return ((GridLayoutManager) layoutManager).getSpanCount();
}
return -1;
}
}
方法三:(目前只支持2列)
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
private Drawable mDivider;
public DividerGridItemDecoration(Context context) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = ContextCompat.getDrawable(context, R.drawable.shape_divider);
a.recycle();
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
drawHorizontal(c, parent);
drawVertical(c, parent);
}
private int getSpanCount(RecyclerView parent) {
// 列數(shù)
int spanCount = -1;
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
spanCount = ((StaggeredGridLayoutManager) layoutManager)
.getSpanCount();
}
return spanCount;
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getLeft() - params.leftMargin;
final int right = child.getRight() + params.rightMargin
+ mDivider.getIntrinsicWidth();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
if (i % 2 == 1) {
final int top = child.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
final int left = child.getLeft() - params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth() / 2;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
} else {
final int top = child.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth() / 2;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
final int top = child.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
int childCount) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
if ((pos + 1) % spanCount == 0)// 如果是最后一列,則不需要繪制右邊
{
return true;
}
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
int orientation = ((StaggeredGridLayoutManager) layoutManager)
.getOrientation();
if (orientation == StaggeredGridLayoutManager.VERTICAL) {
if ((pos + 1) % spanCount == 0)// 如果是最后一列,則不需要繪制右邊
{
return true;
}
} else {
childCount = childCount - childCount % spanCount;
if (pos >= childCount)// 如果是最后一列,則不需要繪制右邊
return true;
}
}
return false;
}
private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
int childCount) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
childCount = childCount - childCount % spanCount;
if (pos >= childCount)// 如果是最后一行,則不需要繪制底部
return true;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
int orientation = ((StaggeredGridLayoutManager) layoutManager)
.getOrientation();
// StaggeredGridLayoutManager 且縱向滾動(dòng)
if (orientation == StaggeredGridLayoutManager.VERTICAL) {
childCount = childCount - childCount % spanCount;
// 如果是最后一行,則不需要繪制底部
if (pos >= childCount)
return true;
} else
// StaggeredGridLayoutManager 且橫向滾動(dòng)
{
// 如果是最后一行,則不需要繪制底部
if ((pos + 1) % spanCount == 0) {
return true;
}
}
}
return false;
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition,
RecyclerView parent) {
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,則不需要繪制底部
{
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
} else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,則不需要繪制右邊
{
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(),
mDivider.getIntrinsicHeight());
}
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android RecycleView使用(CheckBox全選、反選、單選)
- Android 中RecycleView實(shí)現(xiàn)item的點(diǎn)擊事件
- Android recycleView的應(yīng)用和點(diǎn)擊事件實(shí)例詳解
- Android ListView與RecycleView的對(duì)比使用解析
- Android App中ViewPager所帶來的滑動(dòng)沖突問題解決方法
- Android中DrawerLayout+ViewPager滑動(dòng)沖突的解決方法
- 淺談Viewpager和輪播圖的沖突解決方法
- Android 中SwipeRefreshLayout與ViewPager滑動(dòng)事件沖突解決方法
- Android解決viewpager嵌套滑動(dòng)沖突并保留側(cè)滑菜單功能
- Android中RecycleView與ViewPager沖突的解決方法及原理
相關(guān)文章
Android多渠道打包時(shí)獲取當(dāng)前渠道的方法
這篇文章主要介紹了Android多渠道打包時(shí)獲取當(dāng)前渠道的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
Android巧用ViewPager實(shí)現(xiàn)左右循環(huán)滑動(dòng)圖片
這篇文章主要為大家詳細(xì)介紹了Android巧用ViewPager實(shí)現(xiàn)左右循環(huán)滑動(dòng)圖片的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-05-05
Android之使用Android-query框架開發(fā)實(shí)戰(zhàn)(二)
這篇文章主要介紹了Android之使用Android-query框架開發(fā)實(shí)戰(zhàn)(二)的相關(guān)資料,需要的朋友可以參考下2015-10-10
Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼
這篇文章主要介紹了Android打印機(jī)--小票打印格式及模板設(shè)置實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
Android使用WebSocket實(shí)現(xiàn)多人游戲
WebSocket 是 HTML5 一種新的協(xié)議。實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,下面通過本文給大家分享Android使用WebSocket實(shí)現(xiàn)多人游戲,需要的朋友參考下吧2017-11-11
Android 多種dialog的實(shí)現(xiàn)方法(推薦)
下面小編就為大家分享一篇Android 多種dialog的實(shí)現(xiàn)方法(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01

