Android 中RecyclerView頂部刷新實現(xiàn)詳解
Android 中RecyclerView頂部刷新實現(xiàn)詳解
1. RecyclerView頂部刷新的原理
RecyclerView頂部刷新的實現(xiàn)通常都是在RecyclerView外部再包裹一層布局。在這個外層布局中,還包含一個自定義的View,作為頂部刷新時的指示View。也就是說,外層布局中包含兩個child,一個頂部刷新View,一個RecyclerView,頂部刷新View默認是隱藏不可見的。在外層布局中對滑動事件進行處理,當RecyclerView滑動到頂部并繼續(xù)下滑的時候,根據(jù)滑動的距離決定頂部刷新View的顯示。當滑動距離超過某個設定的值的時候,執(zhí)行頂部刷新操作。
2. RecyclerView頂部刷新的實現(xiàn)
RecyclerView頂部刷新的實現(xiàn)一般包含如下步驟。
- 創(chuàng)建自定義的布局類,它可以繼承自已有的布局類,如LinearLayout,也可以直接繼承自ViewGroup。
- 添加RecyclerView和頂部刷新View作為其child。
- 重寫自定義的布局類的onMeasure(),onLayout(),dispatchTouchEvent(),onInterceptTouchEvent()等方法。
步驟3是其中最復雜的部分,需要在這些重寫的方法中,完成自身和child的測量,布局和滑動事件的處理。尤其是滑動事件的處理,需要對Android View的滑動機制有全面的了解才能實現(xiàn)。
Google在19.1之后的support library v4包中增加了SwipeRefreshLayout類。它繼承自ViewGroup,在它的內(nèi)部包含了一個CircleImageView對象作為頂部刷新View,同時它實現(xiàn)了上述步驟3的全部功能。將SwipeRefreshLayout和RecyclerView結(jié)合在一起,可以輕松的實現(xiàn)頂部刷新功能。
3.1 SwipeRefreshLayout用法
在介紹SwipeRefreshLayout和RecyclerView結(jié)合實現(xiàn)頂部刷新功能之前,先介紹下SwipeRefreshLayout的用法。
SwipeRefreshLayout最重要的兩個方法是:setOnRefreshListener()和setRefreshing()。
setOnRefreshListener()方法用來設置頂部刷新事件的監(jiān)聽,當需要執(zhí)行頂部刷新時會調(diào)用此listener的onRefresh()方法,來獲取最新的數(shù)據(jù)。
setRefreshing()方法用來設置頂部刷新狀態(tài)。當數(shù)據(jù)獲取完成后,需要調(diào)用此方法表示刷新完成。
除此之外,SwipeRefreshLayout還提供了一些方法用來設置頂部刷新View進度條顏色,背景色等。
3.2 SwipeRefreshLayout結(jié)合RecyclerView實現(xiàn)頂部刷新
SwipeRefreshLayout結(jié)合RecyclerView實現(xiàn)頂部刷新功能非常簡單,只需要在SwipeRefreshLayout中包含一個RecyclerView作為其child即可。可以直接通過XML文件來布局。
XML布局如下。
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
為了方便使用,可以對這里的布局設置通過代碼進行封裝,創(chuàng)建一個自定義的XSwipeRefreshLayout類來實現(xiàn)。代碼方式實現(xiàn)如下。由于布局非常簡單,代碼中就沒有引入布局文件了。
public class XSwipeRefreshLayout extends SwipeRefreshLayout {
private RecyclerView mRecyclerView;
public XSwipeRefreshLayout(Context context) {
super(context);
init(context);
}
public XSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mRecyclerView = new RecyclerView(context);
addView(mRecyclerView);
}
}
3.3 操作RecyclerView
對XML方式實現(xiàn)的頂部刷新,要操作RecyclerView只需要通過findViewById()找到對應的RecyclerView對象,然后調(diào)用相應的方法即可。
對代碼方式實現(xiàn)的頂部刷新,需要在XSwipeRefreshLayout中增加操作內(nèi)部RecyclerView的接口??梢杂袃煞N方式:一種是在XSwipeRefreshLayout中增加getRecyclerView()方法,返回內(nèi)部的RecyclerView對象,然后在外部調(diào)用RecyclerView對象的方法。另一種是XSwipeRefreshLayout中增加RecyclerView對應的各種方法,然后透傳給內(nèi)部的RecyclerView對象。這兩種方式的示例代碼如下。
public class XSwipeRefreshLayout extends SwipeRefreshLayout {
private RecyclerView mRecyclerView;
public XSwipeRefreshLayout(Context context) {
super(context);
init(context);
}
public XSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mRecyclerView = new RecyclerView(context);
addView(mRecyclerView);
}
public RecyclerView getRecyclerView() {
return mRecyclerView;
}
}
public class XSwipeRefreshLayout extends SwipeRefreshLayout {
private RecyclerView mRecyclerView;
public XSwipeRefreshLayout(Context context) {
super(context);
init(context);
}
public XSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mRecyclerView = new RecyclerView(context);
addView(mRecyclerView);
}
public RecyclerView.Adapter getAdapter() {
return mRecyclerView.getAdapter();
}
public void setAdapter(RecyclerView.Adapter adapter) {
mRecyclerView.setAdapter(adapter);
}
public void setLayoutManager(RecyclerView.LayoutManager layout) {
mRecyclerView.setLayoutManager(layout);
}
// 將需要用到的每個RecyclerView的方法都寫在這里
.....
}
3. RecyclerView同時支持頂部刷新和底部刷新
在實際的應用中,頂部刷新通常都需要和底部刷新一起使用。要讓RecyclerView同時支持頂部刷新和底部刷新,只需要將上述頂部刷新實現(xiàn)中的RecyclerView換成上一篇文章中XRecyclerView即可。
XML布局如下。
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<cnx.ccpat.testapp.XRecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</cnx.ccpat.testapp.XRecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
對應的代碼方式實現(xiàn)如下。
public class XSwipeRefreshLayout extends SwipeRefreshLayout {
private XRecyclerView mRecyclerView;
public XSwipeRefreshLayout(Context context) {
super(context);
init(context);
}
public XSwipeRefreshLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
private void init(Context context) {
mRecyclerView = new XRecyclerView(context);
addView(mRecyclerView);
}
}
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android自定義ListView實現(xiàn)下拉刷新上拉加載更多
- android RecycleView實現(xiàn)下拉刷新和上拉加載
- 解決android viewmodel 數(shù)據(jù)刷新異常的問題
- Android巧用XListView實現(xiàn)萬能下拉刷新控件
- Android自定義view仿微信刷新旋轉(zhuǎn)小風車
- Android自定義控件ListView下拉刷新的代碼
- Android ExpandableListView實現(xiàn)下拉刷新和加載更多效果
- Android RecyclerView的刷新分頁的實現(xiàn)
- android使用SwipeRefreshLayout實現(xiàn)ListView下拉刷新上拉加載
- android使用PullToRefresh框架實現(xiàn)ListView下拉刷新上拉加載更多
- Android四種方式刷新View的操作方法
相關文章
加載頁面遮擋耗時操作任務頁面--第三方開源之AndroidProgressLayout
AndroidProgressLayout實現(xiàn)為界面添加圓形進度條。調(diào)用setprogress()方法顯示和隱藏進度條,這篇文章主要介紹了加載頁面遮擋耗時操作任務頁面--第三方開源之AndroidProgressLayout的相關資料,需要的朋友可以參考下2015-11-11
Android開發(fā)之滑動數(shù)值選擇器NumberPicker用法示例
這篇文章主要介紹了Android開發(fā)之滑動數(shù)值選擇器NumberPicker用法,結(jié)合實例形式分析了Android滑動數(shù)值選擇器NumberPicker的功能、相關函數(shù)、事件監(jiān)聽、界面布局等操作技巧,需要的朋友可以參考下2019-03-03
Android 中對JSON數(shù)據(jù)解析實例代碼
這篇文章主要介紹了Android 中對JSON數(shù)據(jù)解析實例代碼的相關資料,需要的朋友可以參考下2017-03-03
Android實現(xiàn)的RecyclerView適配器
這篇文章主要介紹了Android實現(xiàn)的RecyclerView適配器的相關資料,幫助大家更好的理解和學習使用Android,感興趣的朋友可以了解下2021-03-03
Android開發(fā)筆記之Android中數(shù)據(jù)的存儲方式(二)
我們在實際開發(fā)中,有的時候需要儲存或者備份比較復雜的數(shù)據(jù)。這些數(shù)據(jù)的特點是,內(nèi)容多、結(jié)構(gòu)大,比如短信備份等,通過本文給大家介紹Android開發(fā)筆記之Android中數(shù)據(jù)的存儲方式(二),對android數(shù)據(jù)存儲方式相關知識感興趣的朋友一起學習吧2016-01-01
ComposeDesktop開發(fā)桌面端多功能APK工具
這篇文章主要為大家介紹了ComposeDesktop開發(fā)桌面端多功能APK工具實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
Android使用原生組件WebView加載網(wǎng)頁和數(shù)據(jù)的方法
這篇文章主要介紹了Android使用原生組件WebView加載網(wǎng)頁和數(shù)據(jù)的方法的相關資料,需要的朋友可以參考下2016-09-09
Android開發(fā)基礎實現(xiàn)最簡單的視頻播放示例
這篇文章主要為大家介紹了Android開發(fā)基礎實現(xiàn)最簡單的視頻播放示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Android Studio 創(chuàng)建自定義控件的方法
這篇文章主要介紹了Android Studio 創(chuàng)建自定義控件的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06

