精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

RecyclerView中ItemDecoration的精妙用法,實現自定義分隔線、邊距和背景效果

開發 前端
getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state): 設置 item 的邊距。outRect 參數是一個 Rect 對象,可以設置它的 left、top、right 和 bottom 屬性來定義 item 的額外空間。這些額外的空間會用于繪制分隔線或邊距。

ItemDecoration 是 RecyclerView 組件的一個非常有用的功能,用于添加自定義的裝飾項(如分隔線、邊距、背景等)到 RecyclerView 的每個 item 之間或周圍。

recyclerView.addItemDecoration()

ItemDecoration主要的三個方法:

  1. onDraw(Canvas c, RecyclerView parent, RecyclerView.State state): 在 RecyclerView 的 canvas 上繪制自定義的裝飾項,通常用于繪制分隔線或背景。
  2. onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state): 與 onDraw 類似,但繪制的內容會出現在 item 的視圖之上。在 item 視圖上方繪制內容(如高亮或選擇效果),可以使用這個方法。
  3. getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state): 設置 item 的邊距。outRect 參數是一個 Rect 對象,可以設置它的 left、top、right 和 bottom 屬性來定義 item 的額外空間。這些額外的空間會用于繪制分隔線或邊距。

圖片圖片

  • 圖1:代表了getItemOffsets(),可以實現類似padding的效果。
  • 圖2:代表了onDraw(),可以實現類似繪制背景的效果,內容在上面。
  • 圖3:代表了onDrawOver(),可以繪制在內容的上面,覆蓋內容。

分割線

實現分割線效果需要 getItemOffsets()和 onDraw()2個方法,首先用 getItemOffsets給item下方空出一定高度的空間(例子中是1dp),然后用onDraw繪制這個空間。

public class SimpleDividerDecoration extends RecyclerView.ItemDecoration {

    private int dividerHeight;
    private Paint dividerPaint;

    public SimpleDividerDecoration(Context context) {
        dividerPaint = new Paint();
        dividerPaint.setColor(context.getResources().getColor(R.color.colorAccent));
        dividerHeight = context.getResources().getDimensionPixelSize(R.dimen.divider_height);
    }


    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        outRect.bottom = dividerHeight;
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        int childCount = parent.getChildCount();
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();

        for (int i = 0; i < childCount - 1; i++) {
            View view = parent.getChildAt(i);
            float top = view.getBottom();
            float bottom = view.getBottom() + dividerHeight;
            c.drawRect(left, top, right, bottom, dividerPaint);
        }
    }
}

圖片圖片

標簽

標簽都是覆蓋在內容之上的,可以用onDrawOver()來實現,這里簡單實現一個顏色標簽。

public class LeftAndRightTagDecoration extends RecyclerView.ItemDecoration {
    private int tagWidth;
    private Paint leftPaint;
    private Paint rightPaint;

    public LeftAndRightTagDecoration(Context context) {
        leftPaint = new Paint();
        leftPaint.setColor(context.getResources().getColor(R.color.colorAccent));
        rightPaint = new Paint();
        rightPaint.setColor(context.getResources().getColor(R.color.colorPrimary));
        tagWidth = context.getResources().getDimensionPixelSize(R.dimen.tag_width);
    }

    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = parent.getChildAt(i);
            int pos = parent.getChildAdapterPosition(child);
            boolean isLeft = pos % 2 == 0;
            if (isLeft) {
                float left = child.getLeft();
                float right = left + tagWidth;
                float top = child.getTop();
                float bottom = child.getBottom();
                c.drawRect(left, top, right, bottom, leftPaint);
            } else {
                float right = child.getRight();
                float left = right - tagWidth;
                float top = child.getTop();
                float bottom = child.getBottom();
                c.drawRect(left, top, right, bottom, rightPaint);
            }
        }
    }
}

圖片圖片

ItemDecoration組合

ItemDecoration是可以疊加的,可以將多個效果通過addItemDecoration方法疊加,將上面兩種效果疊加。

recyclerView.addItemDecoration(new LeftAndRightTagDecoration(this));
recyclerView.addItemDecoration(new SimpleDividerDecoration(this));

圖片圖片

Section分組

定義接口用來進行數據分組和獲取首字母,重寫getItemOffsets()和onDraw()方法,并根據數據進行分組處理。

public interface DecorationCallback {

        long getGroupId(int position);

        String getGroupFirstLine(int position);
    }
public class SectionDecoration extends RecyclerView.ItemDecoration {
    private static final String TAG = "SectionDecoration";

    private DecorationCallback callback;
    private TextPaint textPaint;
    private Paint paint;
    private int topGap;
    private Paint.FontMetrics fontMetrics;


    public SectionDecoration(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.getFontMetrics(fontMetrics);
        textPaint.setTextAlign(Paint.Align.LEFT);
        fontMetrics = new Paint.FontMetrics();
        topGap = res.getDimensionPixelSize(R.dimen.sectioned_top);//32dp


    }


    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        int pos = parent.getChildAdapterPosition(view);
        Log.i(TAG, "getItemOffsets:" + pos);
        long groupId = callback.getGroupId(pos);
        if (groupId < 0) return;
        if (pos == 0 || isFirstInGroup(pos)) {//同組的第一個才添加padding
            outRect.top = topGap;
        } else {
            outRect.top = 0;
        }
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDraw(c, parent, state);
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View view = parent.getChildAt(i);
            int position = parent.getChildAdapterPosition(view);
            long groupId = callback.getGroupId(position);
            if (groupId < 0) return;
            String textLine = callback.getGroupFirstLine(position).toUpperCase();
            if (position == 0 || isFirstInGroup(position)) {
                float top = view.getTop() - topGap;
                float bottom = view.getTop();
                c.drawRect(left, top, right, bottom, paint);//繪制紅色矩形
                c.drawText(textLine, left, bottom, 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);
    }
}
recyclerView.addItemDecoration(new SectionDecoration(this, new SectionDecoration.DecorationCallback() {
    @Override
    public long getGroupId(int position) {
        return Character.toUpperCase(dataList.get(position).getName().charAt(0));
    }

    @Override
    public String getGroupFirstLine(int position) {
        return dataList.get(position).getName().substring(0, 1).toUpperCase();
    }
}));

StickyHeader

頭部吸頂效果,header不動肯定是要繪制item內容之上,需要重寫onDrawOver()方法,其和Section實現一樣。

public class PinnedSectionDecoration extends RecyclerView.ItemDecoration {
    private static final String TAG = "PinnedSectionDecoration";

    private DecorationCallback callback;
    private TextPaint textPaint;
    private Paint paint;
    private int topGap;
    private Paint.FontMetrics fontMetrics;


    public PinnedSectionDecoration(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.getFontMetrics(fontMetrics);
        textPaint.setTextAlign(Paint.Align.LEFT);
        fontMetrics = new Paint.FontMetrics();
        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) {
        super.onDrawOver(c, parent, state);
        int itemCount = state.getItemCount();
        int childCount = parent.getChildCount();
        int left = parent.getPaddingLeft();
        int right = parent.getWidth() - parent.getPaddingRight();
        float lineHeight = textPaint.getTextSize() + fontMetrics.descent;

        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();
            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);
            c.drawText(textLine, left, textY, textPaint);
        }
    }
}

圖片圖片

責任編輯:武曉燕 來源: 沐雨花飛蝶
相關推薦

2020-02-21 13:55:35

CSS分隔線前端

2010-08-12 09:45:33

jQuery自定義事件

2025-04-27 09:12:42

2024-05-30 08:23:37

ViewPager滑動效果接口

2010-09-08 09:11:32

CSSmargin

2022-07-19 06:20:47

CSSbackground

2013-01-06 10:43:54

Android開發View特效

2025-09-22 08:03:34

2013-03-28 10:58:30

自定義Android界android

2010-08-13 11:34:54

Flex自定義事件

2022-06-06 09:01:16

SwiftUI自定義導航

2010-08-25 10:10:30

CSSmargin

2021-11-23 15:06:42

Kubernetes 運維開源

2011-08-12 18:18:03

iPhone開發UIPageContr按鈕

2010-05-11 13:16:21

Unix awk

2022-05-18 07:44:13

自定義菜單前端

2009-09-07 22:00:15

LINQ自定義

2023-05-18 09:25:20

background花式文字效果

2021-09-28 06:00:01

BackgroundCSS技巧

2021-09-14 15:13:18

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

伊人春色精品| 麻豆精品传媒视频| 人妻夜夜添夜夜无码av| 欧美大波大乳巨大乳| 无遮挡的视频在线观看| 欧美交a欧美精品喷水| 欧美激情综合五月色丁香小说| 欧美成人三级视频网站| 亚洲精品一二三四五区| 国产成人三级在线播放| 日韩精品午夜| 色综合天天综合在线视频| 91精品视频在线| 亚洲精品国产熟女久久久| 四虎国产精品免费久久5151| 26uuu亚洲综合色欧美| 欧美日韩福利电影| 午夜福利123| 黄色网页在线观看| 另类小说一区二区三区| 亚洲人成77777在线观看网| 国产 欧美 日韩 一区| 国产情侣av在线| 亚洲成av人片乱码色午夜| 欧美专区日韩专区| 日本不卡二区高清三区| 日韩精品一区二区亚洲av| 欧美成人基地| 4438x亚洲最大成人网| 香蕉精品视频在线| 国产精品区在线观看| 日本大胆欧美| 欧美日韩一区二区三区在线看| 欧美性bbwbbwbbwhd| 欧美a视频在线观看| 欧美日韩p片| 亚洲第一区第一页| 5月婷婷6月丁香| 日本精品久久久久| 一本色道久久精品| 亚洲欧美精品在线| www.色偷偷.com| 欧亚av在线| www国产精品av| 国产精品swag| 中文字幕在线播| 91亚洲一区| 欧美mv日韩mv国产网站app| av动漫在线看| 国产精品—色呦呦| www国产亚洲精品久久麻豆| 国产精品二区在线| 久久国产一级片| 麻豆精品少妇| 欧美性受xxxx黑人xyx性爽| 一区二区三区四区在线视频| 国产婷婷一区二区三区久久| 美女国产一区二区三区| 国产精品久久久久久久久久小说 | 国产天堂av在线| 日韩精品一区二区三区中文 | 国产在线观看欧美| 午夜小视频在线播放| 日韩激情av在线| 久久精品国产96久久久香蕉| 成年女人免费视频| 成人在线高清| 午夜精品成人在线视频| 欧美日韩综合精品| 久久综合九色综合久| 美女在线视频一区| 久久久女女女女999久久| avhd101老司机| 国产精品极品在线观看| 欧美日韩一区二区三区在线| 一道本在线免费视频| av3级在线| 国产精品麻豆视频| 国语精品免费视频| 国产精品国产精品国产专区| 国产一区二区三区蝌蚪| 欧美在线性视频| 一区二区三区四区五区| 欧美日韩三级| 91精品国产精品| chinese全程对白| 日韩福利视频一区| 日韩精品在线看片z| 国产喷水theporn| 国产美女精品视频免费播放软件| 欧美日韩激情视频8区| 特级西西444| 成人77777| 91亚洲大成网污www| 日韩一区不卡| 天天影院图片亚洲| 国产成a人无v码亚洲福利| 国产精品久久久久久久久男| 国产乱淫av片免费| 99久久99久久久精品齐齐| 成人国产一区二区| 在线视频免费观看一区| 乱码第一页成人| 国语自产精品视频在线看| 日韩精品久久久久久久酒店| 欧美精品观看| 91av在线精品| 国产精品一区二区人人爽| av在线不卡电影| 国产精品一区二区三区不卡| 精品亚洲成a人片在线观看| av一区二区三区| 亚洲一卡二卡区| 欧美激情护士| 日韩一区二区免费在线电影| 一级黄色片在线免费观看| 少妇一区二区三区| 欧美裸体男粗大视频在线观看| 在线永久看片免费的视频| 东方aⅴ免费观看久久av| 波多野结衣久草一区| 国产在线91| 亚洲国产精品久久不卡毛片| 91成人综合网| 日韩成人在线一区| 亚洲偷欧美偷国内偷| 法国空姐电影在线观看| 精品91在线| 欧美亚洲视频在线观看| 91黑人精品一区二区三区| 日日夜夜精品视频免费| 国产精品一区二区三区不卡| aa在线视频| 亚洲电影在线播放| 超碰91在线播放| 97人人澡人人爽91综合色| 亚洲成人网在线观看| 精品国产大片大片大片| 日韩不卡一区二区三区| 欧美日韩天天操| 久草在线资源站手机版| 精品久久久久久久久久久久包黑料 | 国产亚洲欧美在线| 亚洲高清不卡一区| 国内精品不卡| 8v天堂国产在线一区二区| 免费网站在线高清观看| 91成人超碰| 国产精品第七十二页| 国产精品高潮呻吟av| 中文字幕av一区二区三区| 4444在线观看| 国产精品国产亚洲精品| 色婷婷av一区二区三区久久| 欧美久久久久久久久久久久| 国内国产精品久久| 精品国产_亚洲人成在线| 人妖欧美1区| 色又黄又爽网站www久久| 污污内射在线观看一区二区少妇| 国产日韩视频在线| 超在线视频97| 一级黄色在线视频| 国产欧美日韩三级| 亚洲视频一二三四| 色先锋久久影院av| 日本成人激情视频| av在线三区| 欧美精品tushy高清| 国产乱了高清露脸对白| 国产精品精品国产一区二区| 5252色成人免费视频| 神马电影在线观看| 一本一道综合狠狠老| 免费看黄色av| 国产呦精品一区二区三区网站| 欧美做受777cos| 国产精品网在线观看| 欧美专区国产专区| 五月天婷婷在线视频| 欧美xxxx在线观看| 青草视频在线观看免费| 国产福利视频一区二区三区| 婷婷四房综合激情五月| 17videosex性欧美| 亚洲欧美另类中文字幕| 一级爱爱免费视频| 亚洲一线二线三线视频| 蜜桃福利午夜精品一区| 狠狠做六月爱婷婷综合aⅴ| 国产精品丝袜白浆摸在线| 天天摸天天干天天操| 亚洲丝袜制服诱惑| 特级丰满少妇一级| 亚洲最大在线| 成人有码视频在线播放| 亚洲精品传媒| 欧美精品一区二区精品网| 国产精品成人免费观看| 激情小说亚洲一区| 亚洲 自拍 另类小说综合图区| 久久综合色占| 国产91在线播放| 飘雪影院手机免费高清版在线观看| 亚洲一卡二卡三卡四卡五卡| 亚洲天堂久久新| 久久久久久久欧美精品| av动漫免费观看| 亚洲一区导航| 中文字幕精品国产| 欧美男人天堂网| 欧美国产1区2区| 制服丝袜在线第一页| 欧美视频不卡| 亚洲人成网站在线播放2019| 女人抽搐喷水高潮国产精品| 91久久国产婷婷一区二区| 国产精品专区免费| 国产午夜精品美女视频明星a级| www.五月婷| 香蕉久久一区二区不卡无毒影院 | 丰满大乳国产精品| 一区二区三区四区高清精品免费观看| 日韩a一级欧美一级| 久久久久看片| 国产91在线免费| 精品一区二区三区的国产在线观看| 国产精品r级在线| 第一福利在线| 欧美日韩午夜精品| 免费看毛片网站| 精品久久久久久久中文字幕| 37p粉嫩大胆色噜噜噜| 日韩有码一区二区三区| 毛片在线视频播放| 国产91精品对白在线播放| 国产精品亚洲综合| 伊人精品综合| 欧美在线视频免费| ****av在线网毛片| 久久久久中文字幕| 国产丝袜在线观看视频| 欧美高跟鞋交xxxxhd| 五月婷婷狠狠干| 亚洲第一区第一页| 天天射天天色天天干| 亚洲成人aaa| 神马一区二区三区| 亚洲国产精品福利| 色视频在线观看福利| 日韩精品视频三区| 国产又粗又猛又爽又| 色综合久久中文字幕综合网 | www.久久久久.com| 亚洲精品一区二区三区香蕉| 亚洲AV午夜精品| 91久久奴性调教| 欧美成人精品欧美一级| 亚洲激情第一区| 久久久夜色精品| 国产精品视频你懂的| 人人妻人人澡人人爽| 国产精品久久毛片av大全日韩| 99在线视频免费| 成人久久18免费网站麻豆| 亚洲美女高潮久久久| av一区二区三区| 国产又大又粗又爽的毛片| 欧美国产一区二区在线观看| 五月天免费网站| 波多野结衣中文一区| 性生生活大片免费看视频| 国产综合色精品一区二区三区| 免费欧美一级片| 麻豆精品视频在线| 国产永久免费网站| 国产白丝网站精品污在线入口| 日韩精品视频一区二区| 久久亚洲春色中文字幕久久久| 国产精品日日摸夜夜爽| 99久久综合国产精品| 国产精久久一区二区三区| 亚洲欧洲韩国日本视频| 日本少妇高潮喷水xxxxxxx| 日本一区免费视频| 国产亚洲精品成人| 91黄色免费版| 精品久久久免费视频| 亚洲国产欧美自拍| 日本黄色一区二区三区| 亚洲色图15p| 亚洲区欧洲区| 九九精品在线视频| sm捆绑调教国产免费网站在线观看| 中文字幕欧美在线| 欧美家庭影院| 国产精品视频中文字幕91| 99re8这里有精品热视频8在线| 日本精品二区| 国产精品草草| 久久综合亚洲精品| 天堂在线一区二区| 国产免费成人在线| 免费一级欧美片在线播放| 北条麻妃在线视频观看| 精品影视av免费| 亚洲制服中文字幕| 久久在线免费观看| 欧美片一区二区| 精品视频全国免费看| 午夜福利一区二区三区| 欧美成人黄色小视频| 亚洲伦乱视频| 国产精品视频久| 美女网站色精品尤物极品姐弟| 亚洲一区二区三区精品动漫| 亚洲乱码视频| 成人一级片网站| 懂色av一区二区三区免费观看| 大地资源高清在线视频观看| 欧美性色xo影院| 天堂网一区二区三区| 欧美一区永久视频免费观看| 国产草草影院ccyycom| 一个人看的www久久| 在线a人片免费观看视频| 97超级碰在线看视频免费在线看| 国产精品日韩精品在线播放| 日韩中文不卡| 久久一本综合频道| 大地资源二中文在线影视观看| 久久婷婷久久一区二区三区| 国产亚洲精品久久久久久打不开| 在线播放日韩导航| 北条麻妃在线| 国产成一区二区| 一道本一区二区三区| 无罩大乳的熟妇正在播放| 成人天堂资源www在线| 黄色在线观看免费| 日韩欧美色电影| 日本孕妇大胆孕交无码| av成人综合网| 很黄很黄激情成人| 91精品又粗又猛又爽| 亚洲国产精品欧美一二99| 亚洲欧美另类综合| 国内揄拍国内精品| 欧美大胆视频| 日本免费黄视频| 国产亚洲污的网站| 亚洲一区二区影视| 久久手机精品视频| 日韩精品一区二区三区免费视频| 黄色a级片免费看| www.欧美.com| 中文在线第一页| 在线电影av不卡网址| 伊人亚洲精品| 日韩精品免费一区| 99精品视频一区| 国产又粗又猛又黄视频| 一区二区在线视频| 亚洲一区有码| 久久久久久久9| 久久先锋影音av| 91中文字幕在线播放| 日韩精品免费综合视频在线播放| 在线中文字幕播放| 亚洲自拍欧美另类| 欧美综合久久| 在线免费黄色网| 亚洲在线一区二区三区| 一级全黄少妇性色生活片| 日韩一区二区三区xxxx| 超级碰碰久久| 亚洲精品一区二| 国产精品综合视频| 日韩在线视频免费看| 日韩亚洲欧美在线| 日韩欧美精品一区二区三区| 亚洲成人自拍视频| 国产激情一区二区三区| www日韩精品| 色青青草原桃花久久综合| 国产 日韩 欧美 综合 一区| 久章草在线视频| 亚洲色图视频网| 日本大臀精品| 亚洲在线观看视频网站| 亚洲影院免费| 国产人妻精品一区二区三区不卡| 欧美手机在线视频| 日本乱理伦在线| 日韩精品资源| 成人性色生活片免费看爆迷你毛片| 国产美女激情视频| 久久中文字幕视频| 国产精品手机在线播放| 色悠悠在线视频|