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...