为RecyclerView添加吸顶条目分组(ItemDecoration)
2017-07-08 12:44
453 查看
通过RecyclerView提供的ItemDecoration 实现不同组条目分隔开间距,并且在间距处绘制吸顶条目分组
在Item内容绘制之前绘制,可以理解成为Item绘制背景
public void onDrawOver()
在Item内容绘制之后绘制,在Item之上绘制,覆盖在内容上
public void getItemOffsets()
给Item设置类似Margin效果(在Margin填充的区域点击,ItemOnclickListener接受不到,因为设置的时候只是给Item ContentView设置点击事件)
ItemDecoration类主要是三个方法:
public void onDraw()在Item内容绘制之前绘制,可以理解成为Item绘制背景
public void onDrawOver()
在Item内容绘制之后绘制,在Item之上绘制,覆盖在内容上
public void getItemOffsets()
给Item设置类似Margin效果(在Margin填充的区域点击,ItemOnclickListener接受不到,因为设置的时候只是给Item ContentView设置点击事件)
吸顶Item具体实现
public class CeilingItemDecoration extends RecyclerView.ItemDecoration { private final TextPaint textPaint; //绘制文字 private Paint mDividerPaint; //绘制组条目背景 private int sessionHeight=100; private List<Integer> mList; public void setList(List list) { mList = list; } public CeilingItemDecoration() { mDividerPaint = new Paint(); mDividerPaint.setColor(Color.GREEN); textPaint = new TextPaint(); textPaint.setTypeface(Typeface.DEFAULT_BOLD); textPaint.setAntiAlias(true); textPaint.setTextSize(80); textPaint.setColor(Color.BLACK); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int position = parent.getChildAdapterPosition(view); Integer i = mList.get(position); if (i%10==0){ outRect.top=sessionHeight; }else { outRect.top=0; } } @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); int childCount = parent.getChildCount(); int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); int last=0; for (int i = 0; i < childCount ; i++) { View childAt = parent.getChildAt(i); int position = parent.getChildAdapterPosition(childAt); //获取实际逻辑的位置,而并非recyclerView 中显示的第几个条目 int num = mList.get(position); num=num/10; int max = Math.max(100, childAt.getBottom()); c.drawRect(left,childAt.getBottom()-max+last,right,childAt.getBottom()-max+100+last,mDividerPaint); c.drawText(num+"",0,childAt.getBottom()-max+100+last,textPaint); //判断是否是一个组的最后一个条目,如果是,则记录每个组最后一个条目的底部位置 if (i== childCount-1||mList.get(position)/10 ==mList.get(position+1)/10){ continue; } last = childAt.getBottom(); } } }
相关文章推荐
- Android RecyclerView添加分隔线 DividerItemDecoration
- android RecyclerView 中添加 FooterView 和 DividerItemDecoration 后不能正确显示的问题
- 利用ItemDecoration给RecyclerView的item添加标题
- Android RecyclerView添加分隔线 DividerItemDecoration
- AndroidStudio GradView在RecyclerView中设置条目(Item)点击事件
- Android RecyclerView之添加Item分割线
- Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件
- 为RecyclerView添加item的点击事件
- RecyclerView 给Item添加点击事件
- RecyclerView添加多个样式不同的Item布局
- 一个能一句话添加header和Footer,并且能滑动删除和交换Item的RecyclerView
- 关于recyclerview的横向布局的宽度以及item的点击事件的添加
- RecyclerView的notifyItemRemoved()方法删除条目问题
- Android中Recyclerview使用2----实现添加删除条目时加动画
- RecyclerView实现条目Item拖拽排序与滑动删除
- RecyclerView使用(二)多种Item布局、添加点击事件
- RecyclerView.ItemDecoration 使用总结
- 自定义 RecyclerView.ItemDecoration
- Grid RecyclerView.ItemDecoration
- RecyclerView 的分割线(divider)--DividerItemDecoration