标题粘在顶部recyclerView

 

粘在顶部的ItemDecoration

ItemDecoration 代码

package com.xuanqi.he.wangdai.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.util.TypedValue;
import android.view.View;

/**
 * @Author: Created by He on 2018/6/29.
 * @Description:
 */

public class StickyItemDecoration extends RecyclerView.ItemDecoration {

    private ISticky mISticky;
    //矩形高度
    private int mRectHeight;
    //文字TextSize
    private int mTextPaintSize;
    private Paint mTxtPaint;
    private Paint mRectPaint;
    //分割线画笔
    private Paint mDividerPaint;

    public StickyItemDecoration(Context context,ISticky iSticky) {
        mISticky=iSticky;
        mRectHeight= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,30,
                context.getResources().getDisplayMetrics());

        mTextPaintSize=(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,17,
                context.getResources().getDisplayMetrics());
        mTxtPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        mTxtPaint.setColor(Color.BLACK);
        mTxtPaint.setTextSize(mTextPaintSize);

        mRectPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        mRectPaint.setStyle(Paint.Style.FILL);
        mRectPaint.setColor(Color.parseColor("#e7e3e3"));

        mDividerPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
        mDividerPaint.setStyle(Paint.Style.FILL);
        mDividerPaint.setColor(Color.parseColor("#e7e3e3"));
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        int childCount=parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view=parent.getChildAt(i);
            int left=parent.getPaddingLeft();
            int right=parent.getWidth()-parent.getPaddingRight();
            int top=view.getTop()-1;
            int bottom=view.getTop();
            //Item分割线
            c.drawRect(left,top,right,bottom,mDividerPaint);
        }
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);

        int childCount=parent.getChildCount();
        int itemCount=state.getItemCount();
        int left=parent.getPaddingLeft();
        int right=parent.getWidth()-parent.getPaddingRight();
        String preGroupTitle;
        String groupTitle="";
        for (int i = 0; i < childCount; i++) {
            View child=parent.getChildAt(i);
            int pos=parent.getChildLayoutPosition(child);
            preGroupTitle=groupTitle;
            groupTitle=mISticky.getGroupTitle(pos);
            //如果当前分组名和之前分组名一样,忽略此次循环
            if (groupTitle.equals(preGroupTitle)) {
                continue;
            }

            if (groupTitle.equals("")) {
                continue;
            }

            //文字的基线,保证显示完全
            int textBaseLine=Math.max(mRectHeight,child.getTop());

            //分组标题
            String title=mISticky.getGroupTitle(pos);

            int viewBottom=child.getBottom();
            //加入限定 防止数组越界
            if (pos + 1 < itemCount) {
                String nextGroupTitle=mISticky.getGroupTitle(pos+1);
                //当分组不一样  并且改组要向上移动时候
                if (!nextGroupTitle.equals(groupTitle) && viewBottom < textBaseLine) {
                    //将上一个往上移动
                    textBaseLine = viewBottom;
                }
            }
            //绘制边框
            c.drawRect(left, textBaseLine - mRectHeight, right, textBaseLine, mRectPaint);

            //绘制文字并且实现文字居中
            int value= (int) Math.abs(mTxtPaint.getFontMetrics().descent
                    +mTxtPaint.getFontMetrics().ascent);
            c.drawText(title, left,
                    textBaseLine-(mRectHeight-value)/2,
                    mTxtPaint);
        }


    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int pos=parent.getChildLayoutPosition(view);
        if (mISticky.isFirstPosition(pos)) {
            outRect.top=mRectHeight;
            outRect.bottom=1;
        }else {
            outRect.bottom=1;
        }
    }
}
package com.xuanqi.he.wangdai.widget;

/**
 * @Author: Created by He on 2018/6/29.
 * @Description:
 */

public interface ISticky {
    //判断是否为同类别的第一个位置
    boolean isFirstPosition(int pos);
    //获取标题
    String getGroupTitle(int pos);
}
mRecyclerView.addItemDecoration(new StickyItemDecoration(getActivity(), new ISticky() {
                                         @Override
                                         public boolean isFirstPosition(int pos) {

                                             if (pos == 0)
                                                 return true;
                                               else  if ((pos>mList.size()-1))
                                                 return false;
                                                else
                                                 if (!mList.get(pos).getTime().substring(0,5).equals(mList.get(pos-1).getTime().substring(0,5)))
                                                 return true;


                                             return false;
                                         }

                                         @Override
                                         public String getGroupTitle(int pos) {

                                             if ((pos>mList.size()-1))
                                                 return "";
                                             return " " + mList.get(pos).getTime().substring(0,5);

                                         }
                                     }));

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值