ui
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
//title
<include
android:id="@+id/title"
layout="@layout/app_title" />
//下拉刷新
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
//列表
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_news_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animationCache="false"
android:persistentDrawingCache="scrolling" />
// 加载状态ui
<include layout="@layout/layout_common_empty" />
</FrameLayout>
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
p 层
public interface IBasePresenter {
/**
* 获取网络数据,更新界面
*/
/**
* 获取网络数据,更新界面
* @param isRefresh 新增参数,用来判断是否为下拉刷新调用,下拉刷新的时候不应该再显示加载界面和异常界面
*/
void getData(boolean isRefresh);
/**
* 加载更多数据
*/
void getMoreData();
}
public class MainGetNewsPresenter implements IBasePresenter {
private MainGetNewsView view;
private String homeid;
//默认加载第一页
private int page = 1;
public MainGetNewsPresenter(MainGetNewsView view,String homeid,int page) {
this.view = view;
this.homeid = homeid;
this.page = page;
}
@Override
public void getData(final boolean isRefresh) {
//每次刷新都初始化page = 1
page = 1;
RetrofitService.getNews("2",page+"")
.doOnSubscribe(new Action0() {
@Override
public void call() {
//加载第一页有两种情况
//1 正常加载,显示dialog动画
//2 下拉刷新,显示下拉刷新动画
//所以要进行判断
if (!isRefresh){
view.showLoading();
}
}
})
.subscribe(new BaseSubscriber<BaseCallModel<List<News>>>() {
//同理加载完成的分类处理
@Override
public void onCompleted() {
if (isRefresh) {
view.finishRefresh();
} else {
view.hideLoading();
}
}
@Override
public void onError(Throwable e) {
view.showNetError();
}
@Override
public void onNext(final BaseCallModel<List<News>> listBaseCallModel) {
//加载完毕在p中做统一处理
view.hideLoading();
view.loadData(listBaseCallModel.code);
//加载成功之后page++
page++;
}
});
}
@Override
public void getMoreData() {
RetrofitService.getNews("2",page+"")
.subscribe(new BaseSubscriber<BaseCallModel<List<News>>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
view.loadNoData();
}
@Override
public void onNext(final BaseCallModel<List<News>> listBaseCallModel) {
view.loadMoreData(listBaseCallModel.code);
//当前页加载成功加载下一页page++
page++;
}
});
}
}
v 层
public interface MainGetNewsView extends ILoadDataView<List<News>> {
}
public interface ILoadDataView<T> extends IBaseView {
/**
* 加载数据
* @param data 数据
*/
void loadData(T data);
/**
* 加载更多
* @param data 数据
*/
void loadMoreData(T data);
/**
* 没有数据
*/
void loadNoData();
}
public interface IBaseView {
/**
* 显示加载动画
*/
void showLoading();
/**
* 隐藏加载
*/
void hideLoading();
/**
* 显示网络错误,modify 对网络异常在 BaseActivity 和 BaseFragment 统一处理
*/
void showNetError();
/**
* 完成刷新, 新增控制刷新
*/
void finishRefresh();
}
activity
//1 下拉刷新
@BindView(R.id.swipe_refresh)
SwipeRefreshLayout mSwipeRefresh;
/**
*2 初始化下拉刷新
*/
private void initSwipeRefresh() {
if (mSwipeRefresh != null) {
SwipeRefreshHelper.init(mSwipeRefresh, new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//下拉刷新才会调用,回调
updateViews(true);
}
});
}
}
//3 在回调函数中关闭加载动画,可以在p层做统一处理
//上拉加载更多,主要用到了BaseQuickAdapter<Comment>
listAdapter.setRequestDataListener(new OnRequestDataListener() {
@Override
public void onLoadMore() {
//上拉回调
commentPresenter.getMoreData();
}
});
@Override
public void loadMoreData(List<Comment> data) {
//加载完成
listAdapter.loadComplete();
listAdapter.addItems(data);
list.addAll(data);
}
待优化