利用ItemDecoration给RecyclerView的item添加标题
来源:互联网 发布:时时彩发计划软件 编辑:程序博客网 时间:2024/05/21 07:58
先看效果
/* * Created by IT小蔡 on 17-7-19 下午4:14 * Copyright (c) 2017. All right reserved * * Last modified 17-7-19 下午4:14 */package cyk.com.doublegangedrecyclerview.itemdecoration;import android.content.Context;import android.content.res.Resources;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Rect;import android.graphics.Typeface;import android.support.v7.widget.RecyclerView;import android.text.TextPaint;import android.text.TextUtils;import android.util.Log;import android.view.View;import cyk.com.doublegangedrecyclerview.R;/** * Created by admin on 2017-7-19. */public class StickyItemDescoration extends RecyclerView.ItemDecoration { private static final String TAG = "PinnedSectionDecoration"; private DecorationCallback callback; private TextPaint textPaint; private Paint paint; private int topGap; public StickyItemDescoration(Context context, DecorationCallback decorationCallback) { Resources res = context.getResources(); this.callback = decorationCallback; paint = new Paint(); paint.setColor(res.getColor(R.color.colorAccent)); textPaint = new TextPaint(); textPaint.setTypeface(Typeface.DEFAULT_BOLD); textPaint.setAntiAlias(true); textPaint.setTextSize(80); textPaint.setColor(Color.BLACK); textPaint.setTextAlign(Paint.Align.LEFT); topGap = res.getDimensionPixelSize(R.dimen.sectioned_top); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); int pos = parent.getChildAdapterPosition(view); long groupId = callback.getGroupId(pos); if (groupId < 0) return; if (pos == 0 || isFirstInGroup(pos)) { outRect.top = topGap; } else { outRect.top = 0; } } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { Log.e(TAG, "onDrawOver: " ); super.onDrawOver(c, parent, state); int childCount = parent.getChildCount(); //获得可见的item数量 int itemCount = parent.getAdapter().getItemCount();//获得所有item数量 int left = parent.getPaddingLeft(); int right = parent.getWidth() - parent.getPaddingRight(); long preGroupId, groupId = -1; for (int i = 0; i < childCount; i++) { View view = parent.getChildAt(i); int position = parent.getChildAdapterPosition(view); preGroupId = groupId; groupId = callback.getGroupId(position); if (groupId < 0 || groupId == preGroupId) continue; String textLine = callback.getGroupFirstLine(position).toUpperCase(); if (TextUtils.isEmpty(textLine)) continue; int viewBottom = view.getBottom();//此时view底部的距离 float textY = Math.max(topGap, view.getTop()); if (position + 1 < itemCount) { //下一个和当前不一样移动当前 long nextGroupId = callback.getGroupId(position + 1); if (nextGroupId != groupId && viewBottom < textY ) {//组内最后一个view进入了header textY = viewBottom; } } c.drawRect(left, textY - topGap, right, textY, paint); Rect rect = new Rect(); textPaint.getTextBounds(textLine,0,textLine.length(),rect); c.drawText(textLine, view.getWidth()/2-rect.width()/2, textY-(topGap-rect.height())/2, textPaint);//绘制居中标题 } } private boolean isFirstInGroup(int pos) { if (pos == 0) { return true; } else { long prevGroupId = callback.getGroupId(pos - 1); long groupId = callback.getGroupId(pos); return prevGroupId != groupId; } } public interface DecorationCallback { long getGroupId(int position); String getGroupFirstLine(int position); }}
recycleView.addItemDecoration(new DividerItemDecoration(mContext,DividerItemDecoration.VERTICAL));//下划线可以叠加
recycleView.addItemDecoration(new StickyItemDescoration(mContext, new StickyItemDescoration.DecorationCallback() { @Override public long getGroupId(int position) { return Character.toUpperCase(list.get(position).charAt(0)); } @Override public String getGroupFirstLine(int position) { return list.get(position).substring(0, 1).toUpperCase(); } }));
阅读全文
0 0
- 利用ItemDecoration给RecyclerView的item添加标题
- 使用ItemDecoration给RecyclerView 添加水印
- 给RecyclerView的Item添加点击事件
- 高性能的给RecyclerView添加下拉刷新和加载更多动画,基于ItemDecoration(一)
- 给recyclerview的item添加点击事件的 一种方法
- 给RecyclerView的item添加点击监听事件
- 给RecyclerView的item添加点击监听事件
- RecyclerView.ItemDecoration的使用
- 关于RecyclerView的ItemDecoration
- RecyclerView 给Item添加点击事件
- Android RecyclerView给Item添加点击事件
- RecyclerView中ItemDecoration的简单使用(一)--设置item的padding
- RecyclerView的分割线 - ItemDecoration
- RecyclerView的分割线:ItemDecoration
- RecyclerView 的 ItemDecoration 学习纪录
- Android之RecyclerView——用ItemDecoration装饰你的Item
- 使用ItemDecoration为RecyclerView添加header
- 理解RecyclerView的RecyclerView.ItemDecoration(一)
- Tornado静态文件
- 【剑指offer】面试题15:二进制中1的个数
- python learning note 1-(19-7-2017)
- 奶牛排队(USACO)( JSOI夏令营2017 day1 T2 ) * * *【O(nlogn)最长上升子序列】
- linux 解压缩功能
- 利用ItemDecoration给RecyclerView的item添加标题
- POJ2135 Farm Tour
- 第三章:3.2 get 请求
- HTML5 Web Storage制作简易数据库
- Boost常用组件概览
- linux命令学习笔记之四
- HyperLogLog资料总结
- maven 本地仓库如何配置以及如何修改默认.m2仓库位置相关
- (转)Eclipse编辑Spring配置文件xml时 提示类class包名,更新springIDE