一. 實現(xiàn)下拉刷新
在google的android.support.v4包中沪么,提供一個SwipeRefreshLayout方法硼婿, 用于實現(xiàn)下拉刷新,實現(xiàn)的過程也非常簡單, 那我們先來看一下SwipeRefreshLayout是什么東西禽车,其實從名字上來看寇漫,它就是一個刷新布局,我們來看它的繼承結(jié)構(gòu)圖:
SwipeRefreshLayout的繼承結(jié)構(gòu)圖
從上面的繼承結(jié)構(gòu)可以看出殉摔, 它繼承于:ViewGroup. 而我們常見的LinearLayout, GridLayout等常見的布局州胳,也是繼承于ViewGroup。所以它的使用方法和我們常見的差不多逸月,我們想要刷新下拉刷新我們的RecyclerView, 那我們就要將我們的RecyclerView布局文件放到SwipeLayout中栓撞。
而在SwipeRefleshLayout中,它又提供了一個接口:SwipeRefreshLayout.OnRefreshListener碗硬, 并且在這個口里面提供了一個抽象方法:onRefresh()瓤湘, 到這里, 我們大概知道它是怎么運作的了恩尾,我們只需要在Activity中弛说,實現(xiàn)這個接口,并且實現(xiàn)OnRefresh()方法即可翰意,在onReflesh()方法中木人,進(jìn)行我們的刷新數(shù)據(jù)操作,下面直接來看主要代碼:
在主布局中的文件:加入以下代碼:
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/layout_swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</android.support.v4.widget.SwipeRefreshLayout>
在Activity中
實現(xiàn)以下核心代碼:
- 創(chuàng)建一個SwipeRefreshLayout對象冀偶,在onCreate()方法中初始化
mRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.layout_swipe_refresh);
- 為其添加SwipeRefreshLayout.OnRefreshListener事件:
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//我在List最前面加入一條數(shù)據(jù)
datas.add(0, "嘿醒第,我是“下拉刷新”生出來的");
//數(shù)據(jù)重新加載完成后,提示數(shù)據(jù)發(fā)生改變进鸠,并且設(shè)置現(xiàn)在不在刷新
adapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
});
二淘讥、上拉加載更多
上拉加載,主要實現(xiàn)的是一個類似分頁的功能堤如,不能一開始的時候就加載全部數(shù)據(jù),如果數(shù)據(jù)很多窒朋,或者是網(wǎng)絡(luò)速度慢的話搀罢,這需要很久的時間才能加載完成。而上拉加載的思想是:我一開始的時候侥猩,就給你加載二十條數(shù)據(jù)左右榔至,如果你還想看下面的數(shù)據(jù)的畫,再次進(jìn)行加載二十條欺劳,分批次加載唧取,這樣就提升了用戶體驗铅鲤。
下面在RecyclerView中,提供了另外一個監(jiān)聽接口:RecyclerView.OnScrollListener
我們可以通過這個接口來創(chuàng)建我們上拉加載更多的功能枫弟。
直接通過代碼來理解邢享,代碼上也有比較詳細(xì)的解析
package com.bobzjg.le.recycleviewdemo;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
/**
* 上拉加載監(jiān)聽接口
* Created by le on 2016/9/24.
*/
public abstract class EndLessOnScrollListener extends RecyclerView.OnScrollListener {
//聲明一個LinearLayoutManager
private LinearLayoutManager mLinearLayoutManager;
//當(dāng)前頁,從0開始
private int currentPage = 0;
//已經(jīng)加載出來的Item的數(shù)量
private int totalItemCount;
//主要用來存儲上一個totalItemCount
private int previousTotal = 0;
//在屏幕上可見的item數(shù)量
private int visibleItemCount;
//在屏幕可見的Item中的第一個
private int firstVisibleItem;
//是否正在上拉數(shù)據(jù)
private boolean loading = true;
public EndLessOnScrollListener(LinearLayoutManager linearLayoutManager) {
this.mLinearLayoutManager = linearLayoutManager;
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = recyclerView.getChildCount();
totalItemCount = mLinearLayoutManager.getItemCount();
firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition();
if(loading){
if(totalItemCount > previousTotal){
//說明數(shù)據(jù)已經(jīng)加載結(jié)束
loading = false;
previousTotal = totalItemCount;
}
}
//這里需要好好理解
if (!loading && totalItemCount-visibleItemCount <= firstVisibleItem){
currentPage ++;
onLoadMore(currentPage);
loading = true;
}
}
/**
* 提供一個抽象方法淡诗,在Activity中監(jiān)聽到這個EndLessOnScrollListener
* 并且實現(xiàn)這個方法
* */
public abstract void onLoadMore(int currentPage);
}
在上面的代碼中骇塘,需要注意的就是理解:visibleItemCount, totalItemCount韩容, firstVisibleItem這幾個單詞的意思款违, 在代碼里看解析,如果看不懂群凶,可以在程序內(nèi)打Log插爹,滑動屏幕,看Log, 這樣來理解比較好理解
監(jiān)聽器已經(jīng)弄好了请梢,接下來赠尾,我們就是在Activity中為RecyclerView添加這個監(jiān)聽器,實現(xiàn)抽象方法onLoadMore()這樣就可以了溢陪。下面看主要代碼:
recyclerView.addOnScrollListener(new EndLessOnScrollListener(layoutManager) {
@Override
public void onLoadMore(int currentPage) {
loadMoreData();
}
});
上面的程序中l(wèi)oadMoreData()方法為:
private void loadMoreData() {
for (int i =0; i < 10; i++){
datas.add("嘿萍虽,我是“上拉加載”生出來的"+i);
adapter.notifyDataSetChanged();
}
}
OK搞定
到這里,整個RecyclerView添加下拉刷新和上拉加載的功能就實現(xiàn)了形真,具體源碼:請看github地址: 源碼下載.
文/右眼皮的愛(簡書作者)原文鏈接:http://www.reibang.com/p/3bf125b4917d著作權(quán)歸作者所有杉编,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標(biāo)注“簡書作者”咆霜。