package com.huxq17.example.base;
import android.content.Context;
import java.lang.reflect.Constructor;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
/**
* Created by huxq17 on 2016/1/18.
*/
public abstract class UltraPagerFragment<T extends BaseBean, P extends BasePresenter> extends BaseFragment {
private P presenter;
/**
* 下一页数据的页数,用于加载下一页数据
*/
private int page;
/**
* 数据有没有加载成功,如果成功了就不去联网获取数据
*/
private boolean hasLoad;
public P getPresenter() {
if (presenter == null) {
presenter = createInstance();
}
return presenter;
}
private P createInstance() {
Type genType = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
Class cls = (Class) params[1];
P present = null;
try {
Constructor c1 = cls.getDeclaredConstructor(new Class[]{getClass()});
c1.setAccessible(true);
present = (P) c1.newInstance(new Object[]{this});
} catch (Exception e) {
e.printStackTrace();
}
return present;
}
/**
* 数据加载失败的回调
*
* @param msg 错误信息
*/
public final void onDataFailed(String msg) {
setLoad(false);
if (page == 0) {
dealRefreshDataFail(msg);
} else {
dealLoadMoreDataFail(msg);
}
stopRefresh();
}
// @Override
// public final void onPageSelected(int position) {
// if (getActivity() != null && !hasLoad()) {
// dealPageSelected(position);
// }
// }
public abstract void stopRefresh();
/**
* 数据加载成功的回调
*
* @param beans 获取数据的实体类集合
* @param success 获取数据是否成功,true代表成功获取了网络的最新数据,false代表获取的是本地缓存
*/
public final void onDataResponse(List<T> beans, boolean success) {
setLoad(success);
stopRefresh();
dealDataResponse(beans, success);
}
/**
* 部分数据加载成功的回调
*
* @param beans 获取数据的实体类集合
*/
public final void onDataLoading(List<T> beans) {
stopRefresh();
dealDataLoading(beans);
}
/**
* 加载更多的回调
*
* @param beans 获取数据的实体类
*/
public final void addFooterData(List<T> beans) {
setLoad(true);
stopRefresh();
dealAddFooter(beans);
}
public int getCurrentPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public void getData(String url, final Context context, Object tag) {
getPresenter().getData(url, context, page, tag);
}
@Override
public void onDestroyView() {
super.onDestroyView();
getPresenter().dettach();
presenter = null;
setLoad(false);
}
/**
* 数据有没有加载成功
*
* @return
*/
public boolean hasLoad() {
return hasLoad;
}
public void setLoad(boolean hasLoad) {
this.hasLoad = hasLoad;
}
/**
* 处理数据刷新失败
*
* @param msg 错误信息
*/
public abstract void dealRefreshDataFail(String msg);
/**
* 处理数据加载更多失败
*
* @param msg 错误信息
*/
public abstract void dealLoadMoreDataFail(String msg);
/**
* 处理数据加载成功
*
* @param bean 获取数据的实体类
* @param success 获取数据是否成功,true代表成功获取了网络的最新数据,false代表获取的是本地缓存
*/
public abstract void dealDataResponse(List<T> bean, boolean success);
/**
* 处理部分数据加载成功
*
* @param bean 获取数据的实体类
*/
public abstract void dealDataLoading(List<T> bean);
/**
* 处理加载更多
*
* @param beans 获取数据的实体类
*/
public abstract void dealAddFooter(List<T> beans);
/**
* 处理当前页被选中的事件
*
* @param position 当前fragment所在的位置
*/
public abstract void dealPageSelected(int position);
}