Recyclerview的ItemDecoration簡單使用

原文:Android——RecyclerView入門學(xué)習(xí)之ItemDecoration

image.png

簡單效果:水平方向第一個(gè)和最后一個(gè)加間距

項(xiàng)目里有一個(gè)水平滑動(dòng)的RecyclerView,第一個(gè)和最后一個(gè)距離手機(jī)兩邊間距大一點(diǎn),其他的間距都靠加的背景圖帶了點(diǎn)距離撐開
以前的我都是在item里左右都放一個(gè)View,判斷第0個(gè)的時(shí)候顯示左邊的View,最后一個(gè)顯示右邊的View,其他的兩個(gè)View都隱藏,方法很笨,但是也實(shí)現(xiàn)了
但是強(qiáng)大的RecyclerView會(huì)教你優(yōu)雅的實(shí)現(xiàn)間距,就是 ItemDecoration

看了文章寫了一個(gè)可以實(shí)現(xiàn)上述效果的一個(gè)簡單ItemDecoration,這里記錄一下

/**
 *水平滑動(dòng)的RecyclerView:第0個(gè)和第size-1個(gè)加間距尔许,其他的不加
 *垂直滑動(dòng)的RecyclerView:每個(gè)底部加36的間距
 */
public class RecyclerViewLeftRightAddPadding extends RecyclerView.ItemDecoration {

    private int drawPadding = 36;
    private int orientation;
    private Paint paint;

    public RecyclerViewLeftRightAddPadding(Context context, int orientation) {

        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(context.getResources().getColor(R.color.white));

        this.orientation = orientation;
    }

     @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        super.getItemOffsets(outRect, view, parent, state);
        //加一個(gè)偏移量

        RecyclerView.LayoutManager manager = parent.getLayoutManager();
        int index = parent.getChildAdapterPosition(view);
        int listSize = state.getItemCount();

        if (manager instanceof LinearLayoutManager) {
            if (orientation == LinearLayoutManager.VERTICAL) {
                //垂直
                outRect.set(0, 0, 0, drawPadding);
            } else {
                //水平
                if (index == 0) {
                    outRect.set(drawPadding, 0, 0, 0);
                } else if (index == listSize - 1) {
                    outRect.set(0, 0, drawPadding, 0);
                } else {
                    outRect.set(0, 0, 0, 0);
                }
            }
        }
    }

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

        int listSize = state.getItemCount();
//        LogUtil.d("listSize = " + listSize);
        int childCount = parent.getChildCount();
//        LogUtil.d("childCount = " + childCount);

        for (int i = 0; i < childCount; i++) {
            View view = parent.getChildAt(i);
            int index = parent.getChildAdapterPosition(view);
//            LogUtil.d("index = " + index);

            if (orientation == LinearLayoutManager.VERTICAL) {
                //垂直
                float top = view.getBottom();
                float bottom = view.getBottom() + drawPadding;
                float left = view.getLeft();
                float right = view.getRight();
                c.drawRect(left, top, right, bottom, paint);

            } else {
                //水平
                if (index == 0) {
                    c.drawRect(view.getLeft() - drawPadding, view.getTop(), view.getLeft(), view.getBottom(), paint);
//                    LogUtil.d("left = " + (view.getLeft() - drawPadding) + ",top = " + top + ",right = " + view.getRight() + ",bottom = " + bottom);
                } else if (index == listSize - 1) {
                    c.drawRect(view.getRight(), view.getTop(), view.getRight() + drawPadding, view.getBottom(), paint);
//                    LogUtil.d("left = " + view.getLeft() + ",top = " + top + ",right = " + (view.getRight() + drawPadding) + ",bottom = " + bottom);
                } else {
                    c.drawRect(view.getLeft(), view.getTop(), view.getLeft(), view.getBottom(), paint);
//                    LogUtil.d("left = " + view.getLeft() + ",top = " + top + ",right = " + view.getRight() + ",bottom = " + bottom);
                }
            }
        }
 
    }

調(diào)用

        manager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.addItemDecoration(new RecyclerViewLeftRightAddPadding(this, LinearLayoutManager.HORIZONTAL));
        horizontalAdapter = new RecyclerViewHorizontalAdapter(this, list);
        recyclerView.setAdapter(horizontalAdapter);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市双饥,隨后出現(xiàn)的幾起案子烙如,更是在濱河造成了極大的恐慌喂分,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異袜啃,居然都是意外死亡彼水,警方通過查閱死者的電腦和手機(jī)崔拥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凤覆,“玉大人链瓦,你說我怎么就攤上這事《㈣耄” “怎么了慈俯?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長拥峦。 經(jīng)常有香客問我贴膘,道長,這世上最難降的妖魔是什么略号? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任刑峡,我火速辦了婚禮,結(jié)果婚禮上璃哟,老公的妹妹穿的比我還像新娘氛琢。我一直安慰自己,他們只是感情好随闪,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布阳似。 她就那樣靜靜地躺著,像睡著了一般铐伴。 火紅的嫁衣襯著肌膚如雪撮奏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天当宴,我揣著相機(jī)與錄音畜吊,去河邊找鬼。 笑死户矢,一個(gè)胖子當(dāng)著我的面吹牛玲献,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼捌年,長吁一口氣:“原來是場噩夢啊……” “哼瓢娜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起礼预,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤眠砾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后托酸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體褒颈,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年励堡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谷丸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡应结,死狀恐怖淤井,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摊趾,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布游两,位于F島的核電站砾层,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贱案。R本人自食惡果不足惜肛炮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望宝踪。 院中可真熱鬧侨糟,春花似錦、人聲如沸瘩燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厉膀。三九已至溶耘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間服鹅,已是汗流浹背凳兵。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留企软,地道東北人庐扫。 一個(gè)月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親形庭。 傳聞我的和親對象是個(gè)殘疾皇子铅辞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容