前言
本文主要向大家介紹一個思路,用于解決在實際開發(fā)中,加載數(shù)據(jù)列表這個最基本的需求(你應(yīng)該已經(jīng)熟悉recyclerView的用法)。下面我們開始分析加載一個列表一般需要哪些需求。
需求
1.從服務(wù)器獲取一段Json(當(dāng)然也可以是其他格式的數(shù)據(jù)),比如:
{
"list":[
{"name":"zhang","age":20},
{"name":"li","age":10},
{"name":"wang","age":20},
{"name":"zhao","age":30}
]
}
2.新建Adapter,根據(jù)數(shù)據(jù)加載視圖
3.一般需要下拉刷新、上拉加載分頁數(shù)據(jù)
4.無數(shù)據(jù)時,各種花樣的提示,網(wǎng)絡(luò)錯誤時,各種花樣的提示,譬如:

需求差不多就是這些,但是我們開發(fā)時實現(xiàn)還是標(biāo)膠復(fù)雜的,比如:
- 獲取到數(shù)據(jù)更新adapter
- 給SwipeRefreshLayout設(shè)置下拉監(jiān)聽,網(wǎng)絡(luò)請求結(jié)束后關(guān)閉dialog
- 設(shè)置上拉加載函數(shù),網(wǎng)絡(luò)請求完成關(guān)閉上拉加載的狀態(tài)
- 獲取到的數(shù)據(jù)為空或者獲取失敗,顯示相應(yīng)的布局,重新請求成功再隱藏相應(yīng)布局
- 網(wǎng)絡(luò)請求成功后pageIndex++
- 如果分頁大小是20,那么第一次獲取的size小于20,就不能夠上拉加載。
這些代碼,起碼得要個100行吧,寫一次還好,要是動不動就寫個一次

那么接下來就該我封裝的自定義控件BaseRecyclerView登場了,先簡單看一下用法:

神奇吧,這幾行代碼,上面所有的需求都被解決了!?。?/p>
解釋
之前提到的所有需求,都被封裝在BaseRecyclerView里。BaseRecyclerView只對外提供了一個初始化的方法,傳入Adapter,以及實現(xiàn)一個接口。Adapter是干嘛的我們都知道(如果對BaseRecyclerView不了解的同學(xué)可以先去了解一下,當(dāng)然可以繼續(xù)向下看,思路有了,ListView也可以封裝一個類似的),重點說一下NetWorkHandle接口,這個接口里有兩個需要實現(xiàn)的方法,一個是init方法,init方法的作用有在注釋里寫,主要是初始化配置:

然后是loadData方法:
public void loadData(boolean isRefresh, final String pageIndex)這里面其實是使用了代理模式,我們無需關(guān)心在何時何地觸發(fā)上拉操作和下拉操作,只需要知道,當(dāng)用戶下拉或者上拉時,會調(diào)用這個方法,isRefresh是true表示下拉刷新,false表示下拉加載,pageIndex表示頁數(shù),僅此而已。封裝過程如下所示:

源碼
有興趣的查看具體實現(xiàn)細(xì)節(jié),代碼都很簡單,主要就是經(jīng)驗的總結(jié),另外這個項目里還有其他一些整理的東西。代碼寫的不是很好,歡迎提出改進(jìn)建議。
項目地址:https://github.com/gg051202/android-frame
使用

-----------------------------------------------------分割線----------------------------------------------
抱歉,忘了貼文字了:
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
compile 'com.github.gg051202:android-frame:v0.2.8'
}
其實可以去這個網(wǎng)站 https://jitpack.io/,只要在搜索框里輸入github項目的地址,就可以直接引用了,特別方便。比如你可以把別人一些很好的開源庫fork到自己的倉庫里,然后修改一些代碼引用,或者自己寫一些東西然后發(fā)布。