使用場景:
在Android頁面的顯示的時候沐批,往往有很多的頁面加載數(shù)據(jù)分頁邏輯。每次的頁面處理的話會多次的去書寫邏輯判斷。顯得很繁瑣米丘,如何更加簡單的實現(xiàn)一個頁面的分頁邏輯處理。只需要一次的書寫就能處理全部的頁面糊啡。這樣就要考慮到數(shù)據(jù)刷新的封裝性拄查。
一般我們的邏輯處理是在每個頁面進(jìn)行邏輯判斷,如下:
(1)加入行為棚蓄,下拉或者上滑的行為習(xí)慣堕扶,如圖1所示:
圖1
(2)判斷數(shù)據(jù)處理數(shù)據(jù)異步后的獲取碍脏,每次都會去進(jìn)行數(shù)據(jù)的判斷。如圖2所示:
圖2
通過上面的描述稍算,完成一個分頁式的網(wǎng)絡(luò)請求的大致的具體步驟:請求數(shù)據(jù)->解析數(shù)據(jù)->處理數(shù)據(jù)典尾,所以能夠把這三個步驟全部進(jìn)行分離開來是很重要的。一般項目的中的使用的都是mvp架構(gòu)糊探,已經(jīng)把第一步和第二步進(jìn)行了分割钾埂,普通的邏輯完全可以勝任,但是頁面分頁邏輯科平,并沒有處理勃教。這樣每次的分頁的處理還是需要去重新書寫這部分的判斷。如圖3所示:
圖3
所以我們可以在上面的基礎(chǔ)上加入一層的封裝:
新增加兩個類專門去處理下拉和上拉分頁處理問題
(1)BaseLoadMoreAndRefreshView增加分頁行為匠抗,包括回調(diào)數(shù)據(jù)故源,沒有更多數(shù)據(jù),返回數(shù)據(jù)是全部為空的處理汞贸。
/**
* 上拉下拉處理的分類
*/
public interface BaseLoadMoreAndRefreshView<T> extends BaseView {
/**
* 回調(diào)數(shù)據(jù)
*/
void refreshDate(List<T> list);
/**
* 沒有跟多數(shù)據(jù)
*/
void loadMoreNoDate();
/**
* 空數(shù)據(jù)頁面
*/
void loadEmptyPage();
}
(2)BaseLoadMoreAndRefreshPresenter 處理分頁邏輯绳军。
package com.xx.xx.base;
import com.xx.xx.mvp.BasePresenterImpl;
import java.util.ArrayList;
import java.util.List;
/**
* 下拉和上拉數(shù)據(jù)處理抽象類
*/
public abstract class BaseLoadMoreAndRefreshPresenter
<T, D extends BaseLoadMoreAndRefreshView>
extends BasePresenterImpl<D> {
private int page = 1;
private List<T> mDate = new ArrayList<>();
/**
* 設(shè)置頁面信息
*
* @param page
*/
public void setStartPage(int page) {
this.page = page;
}
/**
* 獲取的主要參數(shù)
*
* @param page
*/
protected abstract void loadDate(int page);
/**
* 上拉加載
*/
public void loadMore() {
page++;
loadDate(page);
}
/**
* 下拉刷新
*/
public void refreshDate() {
page = 1;
loadDate(page);
}
/**
* 處理數(shù)據(jù),加入分頁判斷
* @param page
* @param tList
*/
public void showData(int page, List<T> tList) {
if (page == 1) {
if (tList.size() > 0) {
mDate.clear();
mDate.addAll(tList);
mView.refreshDate(mDate);
} else {
mDate.clear();
mView.loadEmptyPage();
}
} else if (page > 1 && tList.size() > 0) {
mDate.addAll(tList);
mView.refreshDate(mDate);
} else {
mView.loadMoreNoDate();
}
}
}
具體使用過程:
(1)界面上使用:
refresh.setOnRefreshLoadMoreListener(new OnRefreshLoadMoreListener() {
@Override
public void onLoadMore(@NonNull RefreshLayout refreshLayout) {
imp.loadMore();
}
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
imp.refreshDate();
}
});
(2)Presenter實現(xiàn)類中數(shù)據(jù)解析后進(jìn)行調(diào)取showData方法進(jìn)行判斷:
@Override
public void onResponseSucceed(String json) {
List<CollectionBean> collectionBeans = GsonUtils.jsonToList(json, CollectionBean.class);
if (collectionBeans != null) {
showData(page, collectionBeans);
}
}
(3)頁面實現(xiàn)View的接口矢腻,進(jìn)行具體的實現(xiàn)门驾。
@Override
public void refreshDate(List<CollectionBean> list) {
adapter.refreshData(list);
}
@Override
public void loadMoreNoDate() {
ToastUtils.showToast(getString(R.string.on_more_date));
}
@Override
public void loadEmptyPage() {
adapter.setEmptyView(EmptyViewHelperForActivity.getInstance().getErrViewNoDate(CollectionActivity.this));
adapter.refreshData(new ArrayList<>());
}
總結(jié):使用這樣的判斷處理能夠更好地處理分頁。