项目作者: shangmengmeng

项目描述 :
RecyclerView的分隔线;拖拽;baseAdapter的点击事件
高级语言: Java
项目地址: git://github.com/shangmengmeng/RecyclerView.git
创建时间: 2017-09-18T08:33:17Z
项目社区:https://github.com/shangmengmeng/RecyclerView

开源协议:

下载


RecyclerView

RecyclerView的分隔线;拖拽;baseAdapter的点击事件

整理的别人的

第一部分ListItemDecoration:

  1. package com.example.administrator.myapplication10;
  2. /*******************************************************************
  3. * * * * * * * * * * * Created by OCN.Yang
  4. * * * * * * * Time:2017/8/2 11:30.
  5. * * * * * * * Email address:ocnyang@gmail.com
  6. * * * * * * * * * * *.Yang Web site:www.ocnyang.com
  7. *******************************************************************/
  8. import android.content.Context;
  9. import android.content.res.TypedArray;
  10. import android.graphics.Canvas;
  11. import android.graphics.Rect;
  12. import android.graphics.drawable.Drawable;
  13. import android.support.v4.content.ContextCompat;
  14. import android.support.v7.widget.LinearLayoutManager;
  15. import android.support.v7.widget.RecyclerView;
  16. import android.view.View;
  17. /**
  18. * 竖直或者水平方向上的分割线,适用于类似于listview效果的分割线,不适用于GrivdView效果的分割线*
  19. */
  20. public class DividerListItemDecoration extends RecyclerView.ItemDecoration {
  21. private static final int[] ATTRS = new int[]{
  22. android.R.attr.listDivider
  23. };
  24. public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
  25. public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
  26. private Drawable mDivider;
  27. private int mOrientation;
  28. public DividerListItemDecoration(Context context, int orientation) {
  29. final TypedArray a = context.obtainStyledAttributes(ATTRS);
  30. mDivider = a.getDrawable(0);
  31. a.recycle();
  32. setOrientation(orientation);
  33. }
  34. public DividerListItemDecoration(Context context, int orientation, int drawableId) {
  35. mDivider = ContextCompat.getDrawable(context, drawableId);
  36. setOrientation(orientation);
  37. }
  38. public void setOrientation(int orientation) {
  39. if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
  40. throw new IllegalArgumentException("invalid orientation");
  41. }
  42. mOrientation = orientation;
  43. }
  44. @Override
  45. public void onDraw(Canvas c, RecyclerView parent) {
  46. if (mOrientation == VERTICAL_LIST) {
  47. drawVertical(c, parent);
  48. } else {
  49. drawHorizontal(c, parent);
  50. }
  51. }
  52. public void drawVertical(Canvas c, RecyclerView parent) {
  53. final int left = parent.getPaddingLeft();
  54. final int right = parent.getWidth() - parent.getPaddingRight();
  55. final int childCount = parent.getChildCount();
  56. for (int i = 0; i < childCount; i++) {
  57. final View child = parent.getChildAt(i);
  58. android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
  59. final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
  60. .getLayoutParams();
  61. final int top = child.getBottom() + params.bottomMargin;
  62. final int bottom = top + mDivider.getIntrinsicHeight();
  63. mDivider.setBounds(left, top, right, bottom);
  64. mDivider.draw(c);
  65. }
  66. }
  67. public void drawHorizontal(Canvas c, RecyclerView parent) {
  68. final int top = parent.getPaddingTop();
  69. final int bottom = parent.getHeight() - parent.getPaddingBottom();
  70. final int childCount = parent.getChildCount();
  71. for (int i = 0; i < childCount; i++) {
  72. final View child = parent.getChildAt(i);
  73. final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
  74. .getLayoutParams();
  75. final int left = child.getRight() + params.rightMargin;
  76. final int right = left + mDivider.getIntrinsicHeight();
  77. mDivider.setBounds(left, top, right, bottom);
  78. mDivider.draw(c);
  79. }
  80. }
  81. @Override
  82. public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
  83. if (mOrientation == VERTICAL_LIST) {
  84. outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
  85. } else {
  86. outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
  87. }
  88. }
  89. }

第二部分GridItemDecoration

  1. package com.ocnyang.recyclerviewevent.recyembellish;
  2. import android.content.Context;
  3. import android.content.res.TypedArray;
  4. import android.graphics.Canvas;
  5. import android.graphics.Color;
  6. import android.graphics.Rect;
  7. import android.graphics.drawable.ColorDrawable;
  8. import android.graphics.drawable.Drawable;
  9. import android.support.v7.widget.GridLayoutManager;
  10. import android.support.v7.widget.RecyclerView;
  11. import android.support.v7.widget.RecyclerView.LayoutManager;
  12. import android.support.v7.widget.RecyclerView.State;
  13. import android.support.v7.widget.StaggeredGridLayoutManager;
  14. import android.view.View;
  15. /*******************************************************************
  16. * * * * * * * * * * * Created by OCN.Yang
  17. * * * * * * * Time:2017/8/2 11:30.
  18. * * * * * * * Email address:ocnyang@gmail.com
  19. * * * * * * * * * * *.Yang Web site:www.ocnyang.com
  20. *******************************************************************/
  21. public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
  22. private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
  23. private Drawable mDivider;
  24. private int lineWidth = 1;
  25. public DividerGridItemDecoration(Context context) {
  26. final TypedArray a = context.obtainStyledAttributes(ATTRS);
  27. mDivider = a.getDrawable(0);
  28. a.recycle();
  29. }
  30. public DividerGridItemDecoration(int color) {
  31. mDivider = new ColorDrawable(color);
  32. }
  33. public DividerGridItemDecoration() {
  34. this(Color.parseColor("#cccccc"));
  35. }
  36. @Override
  37. public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
  38. drawHorizontal(c, parent);
  39. drawVertical(c, parent);
  40. }
  41. private int getSpanCount(RecyclerView parent) {
  42. // 列数
  43. int spanCount = -1;
  44. RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
  45. if (layoutManager instanceof GridLayoutManager) {
  46. spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
  47. } else if (layoutManager instanceof StaggeredGridLayoutManager) {
  48. spanCount = ((StaggeredGridLayoutManager) layoutManager)
  49. .getSpanCount();
  50. }
  51. return spanCount;
  52. }
  53. public void drawHorizontal(Canvas c, RecyclerView parent) {
  54. int childCount = parent.getChildCount();
  55. for (int i = 0; i < childCount; i++) {
  56. final View child = parent.getChildAt(i);
  57. final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
  58. .getLayoutParams();
  59. final int left = child.getLeft() - params.leftMargin;
  60. final int right = child.getRight() + params.rightMargin
  61. + lineWidth;
  62. final int top = child.getBottom() + params.bottomMargin;
  63. final int bottom = top + lineWidth;
  64. mDivider.setBounds(left, top, right, bottom);
  65. mDivider.draw(c);
  66. }
  67. }
  68. public void drawVertical(Canvas c, RecyclerView parent) {
  69. final int childCount = parent.getChildCount();
  70. for (int i = 0; i < childCount; i++) {
  71. final View child = parent.getChildAt(i);
  72. final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
  73. final int top = child.getTop() - params.topMargin;
  74. final int bottom = child.getBottom() + params.bottomMargin;
  75. final int left = child.getRight() + params.rightMargin;
  76. final int right = left + lineWidth;
  77. mDivider.setBounds(left, top, right, bottom);
  78. mDivider.draw(c);
  79. }
  80. }
  81. private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {
  82. RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
  83. if (layoutManager instanceof GridLayoutManager) {
  84. if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
  85. {
  86. return true;
  87. }
  88. } else if (layoutManager instanceof StaggeredGridLayoutManager) {
  89. int orientation = ((StaggeredGridLayoutManager) layoutManager)
  90. .getOrientation();
  91. if (orientation == StaggeredGridLayoutManager.VERTICAL) {
  92. if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
  93. {
  94. return true;
  95. }
  96. } else {
  97. childCount = childCount - childCount % spanCount;
  98. if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
  99. return true;
  100. }
  101. }
  102. return false;
  103. }
  104. private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {
  105. LayoutManager layoutManager = parent.getLayoutManager();
  106. if (layoutManager instanceof GridLayoutManager) {
  107. childCount = childCount - childCount % spanCount;
  108. if (pos >= childCount)// 如果是最后一行,则不需要绘制底部
  109. return true;
  110. } else if (layoutManager instanceof StaggeredGridLayoutManager) {
  111. int orientation = ((StaggeredGridLayoutManager) layoutManager)
  112. .getOrientation();
  113. // StaggeredGridLayoutManager 且纵向滚动
  114. if (orientation == StaggeredGridLayoutManager.VERTICAL) {
  115. childCount = childCount - childCount % spanCount;
  116. // 如果是最后一行,则不需要绘制底部
  117. if (pos >= childCount)
  118. return true;
  119. } else
  120. // StaggeredGridLayoutManager 且横向滚动
  121. {
  122. // 如果是最后一行,则不需要绘制底部
  123. if ((pos + 1) % spanCount == 0) {
  124. return true;
  125. }
  126. }
  127. }
  128. return false;
  129. }
  130. @Override
  131. public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) {
  132. boolean b = state.willRunPredictiveAnimations();
  133. int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
  134. int spanCount = getSpanCount(parent);
  135. int childCount = parent.getAdapter().getItemCount();
  136. // if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部
  137. // {
  138. // outRect.set(0, 0, lineWidth, 0);
  139. // }
  140. // else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边
  141. // {
  142. //// if (b){
  143. //// outRect.set(0, 0, lineWidth, lineWidth);
  144. //// }else {
  145. // outRect.set(0, 0, 0, lineWidth);
  146. //// }
  147. // }
  148. // else {
  149. outRect.set(0, 0, lineWidth, lineWidth);
  150. // }
  151. }
  152. }

用法:

LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
//这里是分割线的用法
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));
recyclerView.setLayoutManager(manager);
recyclerView.setHasFixedSize(true);//Adapter内Item的改变不会影响RecyclerView宽高的时候,可以设置为true让RecyclerView避免重新计算大小