RecyclerView頂部重新整理實現詳解

2021-08-03 05:00:32 字數 4045 閱讀 1579

recyclerview頂部重新整理的實現通常都是在recyclerview外部再包裹一層布局。在這個外層布局中,還包含乙個自定義的view,作為頂部重新整理時的指示view。也就是說,外層布局中包含兩個child,乙個頂部重新整理view,乙個recyclerview,頂部重新整理view預設是隱藏不可見的。在外層布局中對滑動事件進行處理,當recyclerview滑動到頂部並繼續下滑的時候,根據滑動的距離決定頂部重新整理view的顯示。當滑動距離超過某個設定的值的時候,執行頂部重新整理操作。

recyclerview頂部重新整理的實現一般包含如下步驟。

建立自定義的布局類,它可以繼承自已有的布局類,如linearlayout,也可以直接繼承自viewgroup。

新增recyclerview和頂部重新整理view作為其child。

重寫自定義的布局類的onmeasure(),onlayout(),dispatchtouchevent(),onintercepttouchevent()等方法。

步驟3是其中最複雜的部分,需要在這些重寫的方法中,完成自身和child的測量,布局和滑動事件的處理。尤其是滑動事件的處理,需要對android view的滑動機制有全面的了解才能實現。

google在19.1之後的support library v4包中增加了swiperefreshlayout類。它繼承自viewgroup,在它的內部包含了乙個circleimageview物件作為頂部重新整理view,同時它實現了上述步驟3的全部功能。將swiperefreshlayout和recyclerview結合在一起,可以輕鬆的實現頂部重新整理功能。

在介紹swiperefreshlayout和recyclerview結合實現頂部重新整理功能之前,先介紹下swiperefreshlayout的用法。

swiperefreshlayout最重要的兩個方法是:setonrefreshlistener()和setrefreshing()。

setonrefreshlistener()方法用來設定頂部重新整理事件的監聽,當需要執行頂部重新整理時會呼叫此listener的onrefresh()方法,來獲取最新的資料。

setrefreshing()方法用來設定頂部重新整理狀態。當資料獲取完成後,需要呼叫此方法表示重新整理完成。

除此之外,swiperefreshlayout還提供了一些方法用來設定頂部重新整理view進度條顏色,背景色等。

swiperefreshlayout結合recyclerview實現頂部重新整理功能非常簡單,只需要在swiperefreshlayout中包含乙個recyclerview作為其child即可。可以直接通過xml檔案來布局。

xml布局如下。

.support

.v4.widget

.swiperefreshlayout

android:id="@+id/refresh_layout"

android:layout_width="match_parent"

android:layout_height="wrap_content">

.support

.v7.widget

.recyclerview

android:id="@+id/recyclerview"

android:layout_width="match_parent"

android:layout_height="wrap_content">

.support

.v7.widget

.recyclerview>

.support

.v4.widget

.swiperefreshlayout>

為了方便使用,可以對這裡的布局設定通過**進行封裝,建立乙個自定義的xswiperefreshlayout類來實現。**方式實現如下。由於布局非常簡單,**中就沒有引入布局檔案了。

public

class

xswiperefreshlayout

extends

swiperefreshlayout

public

xswiperefreshlayout(context context, attributeset attrs)

private

void

init(context context)

}

對xml方式實現的頂部重新整理,要操作recyclerview只需要通過findviewbyid()找到對應的recyclerview物件,然後呼叫相應的方法即可。

對**方式實現的頂部重新整理,需要在xswiperefreshlayout中增加操作內部recyclerview的介面。可以有兩種方式:一種是在xswiperefreshlayout中增加getrecyclerview()方法,返回內部的recyclerview物件,然後在外部呼叫recyclerview物件的方法。另一種是xswiperefreshlayout中增加recyclerview對應的各種方法,然後透傳給內部的recyclerview物件。這兩種方式的示例**如下。

public

class

xswiperefreshlayout

extends

swiperefreshlayout

public

xswiperefreshlayout(context context, attributeset attrs)

private

void

init(context context)

public recyclerview getrecyclerview()

}

public

class

xswiperefreshlayout

extends

swiperefreshlayout

public

xswiperefreshlayout(context context, attributeset attrs)

private

void

init(context context)

public recyclerview.adapter getadapter()

public

void

setadapter(recyclerview.adapter adapter)

public

void

setlayoutmanager(recyclerview.layoutmanager layout)

// 將需要用到的每個recyclerview的方法都寫在這裡

.....

}

xml布局如下。

.support

.v4.widget

.swiperefreshlayout

android:id="@+id/refresh_layout"

android:layout_width="match_parent"

android:layout_height="wrap_content">

.ccpat

.xrecyclerview

android:id="@+id/recyclerview"

android:layout_width="match_parent"

android:layout_height="wrap_content">

.ccpat

.xrecyclerview>

.support

.v4.widget

.swiperefreshlayout>

對應的**方式實現如下。

public

class

xswiperefreshlayout

extends

swiperefreshlayout

public

xswiperefreshlayout(context context, attributeset attrs)

private

void

init(context context)

}

recyclerView動畫解讀

我彷彿在逗我笑,就算繼承了,還是要呼叫setanimator方法,這樣還是會建立viewholder 那麼,自己給view設定動畫是否可以呢?我們知道,recyclerview是通過notifyitem來改變item的狀態的,這就是傳說中的觀察者模式,那麼我們沒有 notifyitemchanged...

RecyclerView 控制項使用

recyclerview的任務僅限於 和定位螢幕上的列表項,對於列表項的內容顯示我們還需要借助adapter子類和viewholder子類。viewholder的作用是容納view檢視。recyclerview工作需要layoutmanager支援。recyclerview檢視建立好後,要立即交給l...

RecyclerView 單行選擇

概述 相信大家在平時工作中用到listview recyclerview 中進行單行選中高亮 實現recyclerview單行選擇其實挺簡單,將狀態儲存到map集合中,有關recyclerview以後本人會詳細介紹 boolean res false 必須判斷是否為空。而且必須放在前面 ischec...