下面列出了android.support.v7.widget.RecyclerView#VERTICAL 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
int orientation = getOrientation(layoutManager);
int position = parent.getChildLayoutPosition(view);
int spanCount = getSpanCount(layoutManager);
int childCount = layoutManager.getItemCount();
if (orientation == RecyclerView.VERTICAL) {
offsetVertical(outRect, position, spanCount, childCount);
} else {
offsetHorizontal(outRect, position, spanCount, childCount);
}
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
outRect.set(mWidth, mHeight, mWidth, mHeight); // |-|-
}
}
private boolean isLastRaw(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
if (columnCount == 1) {
return position + 1 == childCount;
} else {
int lastRawItemCount = childCount % columnCount;
int rawCount = (childCount - lastRawItemCount) / columnCount + (lastRawItemCount > 0 ? 1 : 0);
int rawPositionJudge = (position + 1) % columnCount;
if (rawPositionJudge == 0) {
int positionRaw = (position + 1) / columnCount;
return rawCount == positionRaw;
} else {
int rawPosition = (position + 1 - rawPositionJudge) / columnCount + 1;
return rawCount == rawPosition;
}
}
} else {
if (columnCount == 1) return true;
return (position + 1) % columnCount == 0;
}
}
private boolean isLastColumn(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
if (columnCount == 1) return true;
return (position + 1) % columnCount == 0;
} else {
if (columnCount == 1) {
return position + 1 == childCount;
} else {
int lastRawItemCount = childCount % columnCount;
int rawCount = (childCount - lastRawItemCount) / columnCount + (lastRawItemCount > 0 ? 1 : 0);
int rawPositionJudge = (position + 1) % columnCount;
if (rawPositionJudge == 0) {
int positionRaw = (position + 1) / columnCount;
return rawCount == positionRaw;
} else {
int rawPosition = (position + 1 - rawPositionJudge) / columnCount + 1;
return rawCount == rawPosition;
}
}
}
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent,
@NonNull RecyclerView.State state) {
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
int orientation = getOrientation(layoutManager);
int position = parent.getChildLayoutPosition(view);
int spanCount = getSpanCount(layoutManager);
int childCount = layoutManager.getItemCount();
if (orientation == RecyclerView.VERTICAL) {
offsetVertical(outRect, position, spanCount, childCount);
} else {
offsetHorizontal(outRect, position, spanCount, childCount);
}
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
outRect.set(mWidth, mHeight, mWidth, mHeight); // |-|-
}
}
private boolean isLastRaw(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
if (columnCount == 1) {
return position + 1 == childCount;
} else {
int lastRawItemCount = childCount % columnCount;
int rawCount = (childCount - lastRawItemCount) / columnCount + (lastRawItemCount > 0 ? 1 : 0);
int rawPositionJudge = (position + 1) % columnCount;
if (rawPositionJudge == 0) {
int positionRaw = (position + 1) / columnCount;
return rawCount == positionRaw;
} else {
int rawPosition = (position + 1 - rawPositionJudge) / columnCount + 1;
return rawCount == rawPosition;
}
}
} else {
if (columnCount == 1) return true;
return (position + 1) % columnCount == 0;
}
}
private boolean isLastColumn(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
if (columnCount == 1) return true;
return (position + 1) % columnCount == 0;
} else {
if (columnCount == 1) {
return position + 1 == childCount;
} else {
int lastRawItemCount = childCount % columnCount;
int rawCount = (childCount - lastRawItemCount) / columnCount + (lastRawItemCount > 0 ? 1 : 0);
int rawPositionJudge = (position + 1) % columnCount;
if (rawPositionJudge == 0) {
int positionRaw = (position + 1) / columnCount;
return rawCount == positionRaw;
} else {
int rawPosition = (position + 1 - rawPositionJudge) / columnCount + 1;
return rawCount == rawPosition;
}
}
}
}
/**
* 画线
*/
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
if (orientation == RecyclerView.HORIZONTAL) {
drawVertical(c, parent, state);
} else if (orientation == RecyclerView.VERTICAL) {
drawHorizontal(c, parent, state);
}
}
/**
* 设置条目周边的偏移量
*/
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
if (orientation == RecyclerView.HORIZONTAL) {
//画垂直线
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
} else if (orientation == RecyclerView.VERTICAL) {
//画水平线
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
}
}
private int getOrientation(RecyclerView.LayoutManager layoutManager) {
if (layoutManager instanceof LinearLayoutManager) {
return ((LinearLayoutManager) layoutManager).getOrientation();
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
return ((StaggeredGridLayoutManager) layoutManager).getOrientation();
}
return RecyclerView.VERTICAL;
}
private boolean isFirstRaw(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
return position < columnCount;
} else {
if (columnCount == 1) return true;
return position % columnCount == 0;
}
}
private boolean isFirstColumn(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
if (columnCount == 1) return true;
return position % columnCount == 0;
} else {
return position < columnCount;
}
}
private int getOrientation(RecyclerView.LayoutManager layoutManager) {
if (layoutManager instanceof LinearLayoutManager) {
return ((LinearLayoutManager)layoutManager).getOrientation();
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
return ((StaggeredGridLayoutManager)layoutManager).getOrientation();
}
return RecyclerView.VERTICAL;
}
private boolean isFirstRaw(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
return position < columnCount;
} else {
if (columnCount == 1) return true;
return position % columnCount == 0;
}
}
private boolean isFirstColumn(int orientation, int position, int columnCount, int childCount) {
if (orientation == RecyclerView.VERTICAL) {
if (columnCount == 1) return true;
return position % columnCount == 0;
} else {
return position < columnCount;
}
}
/**
* 根据当前设置的滚动方向来获取对应的滚动偏移量
*/
private float getScrollOffset() {
return mOrientation == RecyclerView.VERTICAL ? mOffsetY : mOffsetX;
}
@Override
public boolean canScrollVertically() {
return mOrientation == RecyclerView.VERTICAL;
}
@BindingAdapter("layout_vertical")
public static void bindLayoutManager(@NonNull RecyclerView recyclerView, boolean vertical) {
int orientation = vertical ? RecyclerView.VERTICAL : RecyclerView.HORIZONTAL;
recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext(), orientation, false));
}
private RecyclerView.LayoutManager createLayoutManager(Resources resources) {
int spans = resources.getInteger(R.integer.feed_columns);
return new StaggeredGridLayoutManager(spans, RecyclerView.VERTICAL);
}
private RecyclerView.LayoutManager createLayoutManager(Resources resources) {
int spans = resources.getInteger(R.integer.feed_columns);
return new StaggeredGridLayoutManager(spans, RecyclerView.VERTICAL);
}
/**
* @param path 目标路径
* @param itemOffset Item间距
*/
public PathLayoutManager(Path path, int itemOffset) {
this(path, itemOffset, RecyclerView.VERTICAL);
}