1. 程式人生 > >從頭開始學 RecyclerView(五) ItemDecoration 詳解

從頭開始學 RecyclerView(五) ItemDecoration 詳解

前言

RecyclerView.ItemDecoration,通過名字來看,它就是用來裝飾Item的。
在類ListView的檢視中,可能需要繪製分隔線;在類GridView的網格檢視中,可能需要繪製單元格樣式… 這些都可以由重寫RecyclerView.ItemDecoration來進行定製。
然後呼叫mRecyclerView.addItemDecoration(itemDecoration); 即可

分析

看下RecyclerView.ItemDecoration的原始碼:

public static abstract class ItemDecoration {

    public
void onDraw(Canvas c, RecyclerView parent, State state) { onDraw(c, parent); } public void onDrawOver(Canvas c, RecyclerView parent, State state) { onDrawOver(c, parent); } public void getItemOffsets(Rect outRect, View view, RecyclerView parent, State state) { getItemOffsets(outRect, ((LayoutParams) view.getLayoutParams()).getViewLayoutPosition(), parent); } }

這裡找的是,support-v7-25.3.1的RecyclView原始碼,去除了已過時的方法。

關於這三方法的作用:

  • onDraw
    它在item之前繪製,就像裝飾了一個item的背景,在item之前繪製

  • onDrawOver
    它在item之後繪製,就像裝飾了一個item的前景,在item之後繪製

  • getItemOffsets
    指定item間的偏移量。由指定outRect的left、top、right、bottom的畫素值,來偏移item。指定了偏移量後,可能會影響item的寬或高。

這三個方法的執行順序:getItemOffsets > onDraw > onDrawOver

ItemDecoration示例

DividerItemDecoration

DividerItemDecoration,在support-v7中已經集成了。全稱 android.support.v7.widget.DividerItemDecoration

通過通的註釋可知,它是用於在LinearLayoutManager所管理的item之間新增分隔線。

詳細程式碼就不貼了。值得一提的是,它裡面使用了一個系統屬性來指定drawable資源:private static final int[] ATTRS = new int[]{ android.R.attr.listDivider };。 一般在ListView中我們就經常使用一個xml屬性:android:divider。而這裡的屬性android.R.attr.listDivider對應的是android:listDivider。
所以在styles.xml 中就可以定義這個屬性:

<resources>
  <style ...>   
    <item name="android:listDivider">@drawable/divider_hori</item>
  </style>
</resources>

效果圖:

類ListView分隔線
這條 藍紅綠顏色漸變的水平線,就是@drawable/divider_hori
 

GridDecoration

當使用GridLayoutManager時,想在每個item外繪製一個矩形框。
實現:重寫RecyclerView.ItemDecoration的onDraw,繪製矩形框;重寫getItemOffsets,指定item間偏移量。

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

    Paint paint = new Paint();
    paint.setColor(mBackColor);

    for (int i = 0, len = parent.getLayoutManager().getChildCount(); i < len; i++) {
        final View child = parent.getChildAt(i);

        int offset = 5;
        float left = child.getLeft() - offset;
        float top = child.getTop() - offset;
        float right = child.getRight() + offset;
        float bottom = child.getBottom() + offset;

        c.drawRect(left, top, right, bottom, paint);
    }
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
     outRect.offset(20, 30);

     int position = parent.getChildAdapterPosition(view);
     if (position % 2 == 1) {
         outRect.offsetTo(100, 20);
     }
 }

效果圖:

Grid-Item外框

圖中每個item外的 淡藍色的框,就是通過ItemDecoration#onDraw()繪製的。

相關推薦

從頭開始 RecyclerView() ItemDecoration

前言 RecyclerView.ItemDecoration,通過名字來看,它就是用來裝飾Item的。 在類ListView的檢視中,可能需要繪製分隔線;在類GridView的網格檢視中,可能需要繪製單元格樣式… 這些都可以由重寫RecyclerView

RecyclerViewItemDecoration(下)

在上一篇文章中,我和大家一起簡單講解了關於RecyclerView的ItemDecoration抽象類的用法,不過既然文章名叫做《RecyclerView之ItemDecoration詳解》,那麼沒有從原始碼的角度去分析實現原理顯然是稱不上”全”的。因此本篇

mongo 3.4分片集群系列之平衡器

大致 mongos 搭建 一次 相對 時間 表示 部分 man 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4

CentOS6.5下Cloudera安裝搭建部署大數據集群(圖文分大步)(博主強烈推薦)

centos6 數據 http 時間 log .com pos OS 客戶端  第一步: Cloudera Manager安裝之Cloudera Manager安裝前準備(CentOS6.5)(一) 第二步: Cloudera Manager安裝之時間服務器和

一起Python——資料型別

和學習其他程式語言一樣,首先要了解一門語言的資料型別。 Python的資料型別有整型、浮點型、字串、布林型、日期時間型別、list列表、set集合、tuple元組、dict詞典等。 1、整型 就是數學中的整數,包括負整數。 定義整型的方法: a = 100 b = -100 print(a) print

《第一行程式碼Android》學習總結第廣播機制

一、廣播機制簡介         Android提供了一系列API,允許程式自由的傳送和接收廣播,同時每個程式都可以對自己感興趣的廣播進行註冊,該程式便可以只接受來自於系統或其他應用程式的自己關心的廣播內容。 標準廣播:    

從頭開始MySQL-------效能優化

1.使用LIKE關鍵字可能觸發不了索引         首先執行下面的SQL,準備一些資料。 DROP TABLE IF EXISTS t_student; CREATE TABLE `t_student` ( `id` int(11) NO

從頭開始MySQL-------觸發器

12.1.1  建立觸發器         觸發器是由事件觸發的操作,這些事件包括INSERT、UPDATE、DELETE事件。觸發器是一種特殊的儲存過程,它預定義了一些SQL,不用CALL來呼叫。當指定的事件發生的時候,觸發器就會自動執行。

從頭開始MySQL-------儲存過程與儲存函式(4)

儲存過程與儲存函式的補充 MySQL的儲存過程與儲存函式有什麼區別?         儲存函式只能通過return語句返回單個值或者表物件。         儲存過程不能用return,但是可

ItemDecoration以及用ItemDecoration實現按字母排序列表

首先看看實現的效果 可以看出要實現上面效果,有三個步驟: 1.漢字轉化為拼音,並且根據首字母排序 2.用ItemDecoration實現字母行的顯示 3.自定義實現右側的按字母導航欄 當然重點講講ItemDecoration的實現。都知道RecyclerView本

從頭開始eShopOnContainers——Visual Studio 2017環境配置

一、安裝和配置Docker環境 1、安裝Docker CE for Windows   從官方網站下載並安裝,https://docs.docker.com/docker-for-windows/install/。預設情況下Docker for Windows使用Hyper-V執行Linux VM。 如果

《快scala》習題 第1章 基礎

1 輸入3按Tab沒反應,加了.或空格鍵才會觸發 會將Int轉為RichInt 2. 對3開方再乘方 scala> import math._ import math._ scala> math.sqrt(3) res0: Doubl

《快Scala》習題 第12章 高階函式

1 編寫函式values(fun: (Int) => Int, low: Int, high: Int),該函式輸出一個集合,對應給定區間內給定函式的輸入和輸出。比如,values(x => x * x, -5, 5)應該產出一個對偶的集合(-5,

《快Scala》習題 第5章 類

1 改進Counter類,讓它不要在大於Int.maxValue時變為負數 增加一個判斷語句 private var value = 0 def increment() { if (value < Int.MaxValue) value +

《快Scala》習題 第3章 陣列

1 編寫一段程式碼,將a設定為n個隨機整數的陣列,要求隨機數位於[0,n)之間 //建立陣列,[Int]顯示指定陣列的型別,new建立長為10的陣列 //如果不使用new,建立只有一個元素10,型別為Int的陣列 val arr

輕量級深度學習網路():輕量級網路Xception

 一、簡介 Xception並不是真正意義上的輕量化模型,只是其借鑑depth-wise convolution,而depth-wise convolution又是上述幾個輕量化模型的關鍵點,所以在此一併介紹,其思想非常值得借鑑。 Xception是Google提出的,a

密碼_RSA演算法原理

1.RSA演算法簡介:       RSA公鑰加密演算法是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一

《快Scala》習題 第10章 特質

1 java.awt.Rectangle類有兩個很有用的方法translate和grow,但可惜的是像java.awt.geom.Ellipse2D這樣的類沒有。在Scala中,你可以解決掉這個問題。定義一個RenctangleLike特質,加入具體的tran

計算機圖形幾何工具演算法 第一章 緒論

計算機圖形學幾何工具演算法詳解 這本書在網上只找到影印版,很多文字都不太清晰,看起來有點兒費勁,故轉錄成普通文字版。 1.1 如何使用本書 本書包含許多方面的內容。簡單地瀏覽一下目錄,就可以知道本書是一本關於二維和三維幾何演算法的書籍,這些演算法可應用於計算機圖形學