Skip to content

Commit

Permalink
1.0.18 fix setSpanSizeLookup会发生错乱 #13
Browse files Browse the repository at this point in the history
  • Loading branch information
youlookwhat committed Mar 28, 2020
1 parent b367087 commit f1fa5e5
Showing 1 changed file with 109 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@
*/

import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.view.ViewGroup;


/**
Expand All @@ -44,7 +45,6 @@ public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration {
* 距屏幕周围是否也有间距
*/
private boolean mIncludeEdge;

/**
* 头部 不显示间距的item个数
*/
Expand All @@ -53,37 +53,82 @@ public class GridSpaceItemDecoration extends RecyclerView.ItemDecoration {
* 尾部 不显示间距的item个数 默认不处理最后一个item的间距
*/
private int mEndFromSize = 1;
/**
* 瀑布流 头部第一个整行的position
*/
private int fullPosition = -1;

public GridSpaceItemDecoration(int spanCount, int spacing) {
this(spanCount, spacing, true);
public GridSpaceItemDecoration(int spacing) {
this(spacing, true);
}

/**
* @param spanCount item 每行个数
* @param spacing item 间距
* @param includeEdge item 距屏幕周围是否也有间距
*/
public GridSpaceItemDecoration(int spacing, boolean includeEdge) {
this.mSpacing = spacing;
this.mIncludeEdge = includeEdge;
}

/**
* 已不需要手动设置spanCount
*/
@Deprecated
public GridSpaceItemDecoration(int spanCount, int spacing) {
this(spanCount, spacing, true);
}

/**
* 已不需要手动设置spanCount
*/
@Deprecated
public GridSpaceItemDecoration(int spanCount, int spacing, boolean includeEdge) {
this.mSpanCount = spanCount;
this.mSpacing = spacing;
this.mIncludeEdge = includeEdge;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
int lastPosition = state.getItemCount() - 1;
int position = parent.getChildAdapterPosition(view);
if (mStartFromSize <= position && position <= lastPosition - mEndFromSize) {

// 减掉不设置间距的position
position = position - mStartFromSize;
int column = position % mSpanCount;

// 瀑布流获取列方式不一样
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
if (layoutParams instanceof StaggeredGridLayoutManager.LayoutParams) {
column = ((StaggeredGridLayoutManager.LayoutParams) layoutParams).getSpanIndex();
// 行
int spanGroupIndex = -1;
// 列
int column = 0;
// 瀑布流是否占满一行
boolean fullSpan = false;

RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager) {
GridLayoutManager gridLayoutManager = (GridLayoutManager) layoutManager;
GridLayoutManager.SpanSizeLookup spanSizeLookup = gridLayoutManager.getSpanSizeLookup();
int spanCount = gridLayoutManager.getSpanCount();
// 当前position的spanSize
int spanSize = spanSizeLookup.getSpanSize(position);
// 一行几个
mSpanCount = spanCount / spanSize;
// =0 表示是最左边 0 2 4
int spanIndex = spanSizeLookup.getSpanIndex(position, spanCount);
// 列
column = spanIndex / spanSize;
// 行 减去mStartFromSize,得到从0开始的行
spanGroupIndex = spanSizeLookup.getSpanGroupIndex(position, spanCount) - mStartFromSize;

} else if (layoutManager instanceof StaggeredGridLayoutManager) {
// 瀑布流获取列方式不一样
StaggeredGridLayoutManager.LayoutParams params = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
// 列
column = params.getSpanIndex();
// 是否是全一行
fullSpan = params.isFullSpan();
mSpanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();
}
// 减掉不设置间距的position,得到从0开始的position
position = position - mStartFromSize;

if (mIncludeEdge) {
/*
Expand All @@ -95,12 +140,33 @@ public void getItemOffsets(Rect outRect, View view, RecyclerView parent, Recycle
* 10 3+7 6+4 10
* ---------10--------
*/
outRect.left = mSpacing - column * mSpacing / mSpanCount;
outRect.right = (column + 1) * mSpacing / mSpanCount;
if (fullSpan) {
outRect.left = 0;
outRect.right = 0;
} else {
outRect.left = mSpacing - column * mSpacing / mSpanCount;
outRect.right = (column + 1) * mSpacing / mSpanCount;
}

if (position < mSpanCount) {
outRect.top = mSpacing;
if (spanGroupIndex > -1) {
// grid 显示规则
if (spanGroupIndex < 1 && position < mSpanCount) {
// 第一行才有上间距
outRect.top = mSpacing;
}
} else {
if (fullPosition == -1 && position < mSpanCount && fullSpan) {
// 找到头部第一个整行的position,后面的上间距都不显示
fullPosition = position;
}
// Stagger显示规则 头部没有整行或者头部体验整行但是在之前的position显示上间距
boolean isFirstLineStagger = (fullPosition == -1 || position < fullPosition) && (position < mSpanCount);
if (isFirstLineStagger) {
// 第一行才有上间距
outRect.top = mSpacing;
}
}

outRect.bottom = mSpacing;

} else {
Expand All @@ -113,10 +179,31 @@ public void getItemOffsets(Rect outRect, View view, RecyclerView parent, Recycle
* 0 3+7 6+4 0
* --------0--------
*/
outRect.left = column * mSpacing / mSpanCount;
outRect.right = mSpacing - (column + 1) * mSpacing / mSpanCount;
if (position >= mSpanCount) {
outRect.top = mSpacing;
if (fullSpan) {
outRect.left = 0;
outRect.right = 0;
} else {
outRect.left = column * mSpacing / mSpanCount;
outRect.right = mSpacing - (column + 1) * mSpacing / mSpanCount;
}

if (spanGroupIndex > -1) {
if (spanGroupIndex >= 1) {
// 超过第0行都显示上间距
outRect.top = mSpacing;
}
} else {
if (fullPosition == -1 && position < mSpanCount && fullSpan) {
// 找到头部第一个整行的position
fullPosition = position;
}
// Stagger上间距显示规则
boolean isStaggerShowTop = position >= mSpanCount || (fullSpan && position != 0) || (fullPosition != -1 && position != 0);

if (isStaggerShowTop) {
// 超过第0行都显示上间距
outRect.top = mSpacing;
}
}
}
}
Expand Down

0 comments on commit f1fa5e5

Please sign in to comment.