// Path: demo/src/main/java/com/dreamliner/lib/rvhelper/sample/utils/PixelUtil.java
// public class PixelUtil {
// 
//     /**
//      * The mContext.
//      */
//     private static Context mContext;
// 
//     public static void init(Context context) {
//         mContext = context;
//     }
// 
//     /**
//      * dp转 px.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int dp2px(float value) {
//         final float scale = mContext.getResources().getDisplayMetrics().densityDpi;
//         return (int) (value * (scale / 160) + 0.5f);
//     }
// 
//     /**
//      * dp转 px.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int dp2px(float value, Context context) {
//         final float scale = context.getResources().getDisplayMetrics().densityDpi;
//         return (int) (value * (scale / 160) + 0.5f);
//     }
// 
//     /**
//      * px转dp.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int px2dp(float value) {
//         final float scale = mContext.getResources().getDisplayMetrics().densityDpi;
//         return (int) ((value * 160) / scale + 0.5f);
//     }
// 
//     /**
//      * px转dp.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int px2dp(float value, Context context) {
//         final float scale = context.getResources().getDisplayMetrics().densityDpi;
//         return (int) ((value * 160) / scale + 0.5f);
//     }
// 
//     /**
//      * sp转px.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int sp2px(float value) {
//         Resources r;
//         if (mContext == null) {
//             r = Resources.getSystem();
//         } else {
//             r = mContext.getResources();
//         }
//         float spvalue = value * r.getDisplayMetrics().scaledDensity;
//         return (int) (spvalue + 0.5f);
//     }
// 
//     /**
//      * sp转px.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int sp2px(float value, Context context) {
//         Resources r;
//         if (context == null) {
//             r = Resources.getSystem();
//         } else {
//             r = context.getResources();
//         }
//         float spvalue = value * r.getDisplayMetrics().scaledDensity;
//         return (int) (spvalue + 0.5f);
//     }
// 
//     /**
//      * px转sp.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int px2sp(float value) {
//         final float scale = mContext.getResources().getDisplayMetrics().scaledDensity;
//         return (int) (value / scale + 0.5f);
//     }
// 
//     /**
//      * px转sp.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int px2sp(float value, Context context) {
//         final float scale = context.getResources().getDisplayMetrics().scaledDensity;
//         return (int) (value / scale + 0.5f);
//     }
// 
// 
// }


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import androidx.recyclerview.widget.RecyclerView;
import android.util.TypedValue;
import android.view.View;
import com.dreamliner.lib.rvhelper.sample.utils.PixelUtil;
import java.util.List;
                String currentTag = mDatas.get(position).getTag();
                if (!currentTag.equals(mTopTag) && (position == 0 || !currentTag.equals(mDatas.get(position - 1).getTag()))) {
                    //不为空 且跟前一个tag不一样了，说明是新的分类，也要title
                    drawTitleArea(c, left, right, child, params, position);
                }
            }
        }
    }

    /**
     * 绘制Title区域背景和文字的方法
     *
     * @param c
     * @param left
     * @param right
     * @param child
     * @param params
     * @param position
     */
    private void drawTitleArea(Canvas c, int left, int right, View child, RecyclerView.LayoutParams params, int position) {
        //最先调用，绘制在最下层
        mPaint.setColor(COLOR_TITLE_BG);
        c.drawRect(left, child.getTop() - params.topMargin - mTitleHeight, right, child.getTop() - params.topMargin, mPaint);
        mPaint.setColor(COLOR_TITLE_FONT);
        /*
        Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
        int baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
        */
        mPaint.getTextBounds(mDatas.get(position).getTag(), 0, mDatas.get(position).getTag().length(), mBounds);

// Path: demo/src/main/java/com/dreamliner/lib/rvhelper/sample/utils/PixelUtil.java
// public class PixelUtil {
// 
//     /**
//      * The mContext.
//      */
//     private static Context mContext;
// 
//     public static void init(Context context) {
//         mContext = context;
//     }
// 
//     /**
//      * dp转 px.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int dp2px(float value) {
//         final float scale = mContext.getResources().getDisplayMetrics().densityDpi;
//         return (int) (value * (scale / 160) + 0.5f);
//     }
// 
//     /**
//      * dp转 px.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int dp2px(float value, Context context) {
//         final float scale = context.getResources().getDisplayMetrics().densityDpi;
//         return (int) (value * (scale / 160) + 0.5f);
//     }
// 
//     /**
//      * px转dp.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int px2dp(float value) {
//         final float scale = mContext.getResources().getDisplayMetrics().densityDpi;
//         return (int) ((value * 160) / scale + 0.5f);
//     }
// 
//     /**
//      * px转dp.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int px2dp(float value, Context context) {
//         final float scale = context.getResources().getDisplayMetrics().densityDpi;
//         return (int) ((value * 160) / scale + 0.5f);
//     }
// 
//     /**
//      * sp转px.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int sp2px(float value) {
//         Resources r;
//         if (mContext == null) {
//             r = Resources.getSystem();
//         } else {
//             r = mContext.getResources();
//         }
//         float spvalue = value * r.getDisplayMetrics().scaledDensity;
//         return (int) (spvalue + 0.5f);
//     }
// 
//     /**
//      * sp转px.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int sp2px(float value, Context context) {
//         Resources r;
//         if (context == null) {
//             r = Resources.getSystem();
//         } else {
//             r = context.getResources();
//         }
//         float spvalue = value * r.getDisplayMetrics().scaledDensity;
//         return (int) (spvalue + 0.5f);
//     }
// 
//     /**
//      * px转sp.
//      *
//      * @param value the value
//      * @return the int
//      */
//     public static int px2sp(float value) {
//         final float scale = mContext.getResources().getDisplayMetrics().scaledDensity;
//         return (int) (value / scale + 0.5f);
//     }
// 
//     /**
//      * px转sp.
//      *
//      * @param value   the value
//      * @param context the mContext
//      * @return the int
//      */
//     public static int px2sp(float value, Context context) {
//         final float scale = context.getResources().getDisplayMetrics().scaledDensity;
//         return (int) (value / scale + 0.5f);
//     }
// 
// 
// }


// Path: demo/src/main/java/com/dreamliner/lib/rvhelper/sample/view/decoration/TitleItemDecoration.java
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import androidx.recyclerview.widget.RecyclerView;
import android.util.TypedValue;
import android.view.View;
import com.dreamliner.lib.rvhelper.sample.utils.PixelUtil;
import java.util.List;

                String currentTag = mDatas.get(position).getTag();
                if (!currentTag.equals(mTopTag) && (position == 0 || !currentTag.equals(mDatas.get(position - 1).getTag()))) {
                    //不为空 且跟前一个tag不一样了，说明是新的分类，也要title
                    drawTitleArea(c, left, right, child, params, position);
                }
            }
        }
    }

    /**
     * 绘制Title区域背景和文字的方法
     *
     * @param c
     * @param left
     * @param right
     * @param child
     * @param params
     * @param position
     */
    private void drawTitleArea(Canvas c, int left, int right, View child, RecyclerView.LayoutParams params, int position) {
        //最先调用，绘制在最下层
        mPaint.setColor(COLOR_TITLE_BG);
        c.drawRect(left, child.getTop() - params.topMargin - mTitleHeight, right, child.getTop() - params.topMargin, mPaint);
        mPaint.setColor(COLOR_TITLE_FONT);
        /*
        Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();
        int baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;
        */
        mPaint.getTextBounds(mDatas.get(position).getTag(), 0, mDatas.get(position).getTag().length(), mBounds);

        int textPaddingLeft = PixelUtil.dp2px(12);