概述
抽取的好处
减少代码量
逻辑更加清晰
抽取的注意事项
1,所有的成员变量类型都改为 protected
2,对于有泛型类型的数据类型,要使用泛型,并在类中声明该泛型
3,对于有基类类型的数据类型,要使用基类,如:NewsPagerAdapter 在基类中类型改为BaseAdapter
4,对于在基类中不能实现的方法,抽取一个方法,可以在子类中实现(分为必须实现和选择性实现)
5,对于不确定的类型,尽量使用该类型的基类类型,如果没有,可以使用泛型,使用泛型,一定要在类中声明该泛型
TweetPagerFragment抽取前代码
public class TweetPagerFragmentBack extends BaseFragment implements BaseProtocol.Callback<TweetsList> {
private static final int INITDATA = 0;
private static final int REFRESHDATA = 1;
private static final int LOADMOREDATA = 2;
@BindView(R.id.list_view)
ListView mListView;
@BindView(R.id.spring_view)
SpringView mSpringView;
private ArrayList<Tweet> mData;
private MyNewsPagerAdapter mMyNewsPagerAdapter;
private int mCurrentPageIndex;
private TweetsPagerProtocol mTweetsPagerProtocol;
@Override
protected View initView() {
return View.inflate(mContext, R.layout.fragment_news_pager, null);
}
@Override
protected void initData() {
super.initData();
//初次加载数据
initLoadData();
initListView();
initSpringView();
}
@Override
protected void initEvent() {
super.initEvent();
mSpringView.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
//下拉刷新
onDealRefresh();
}
@Override
public void onLoadmore() {
//加载更多数据
onDealLoadmore();
}
});
}
/**
* 设置SpringView的下拉刷新和上拉加载的布局
* 设置SpringView的样式
*/
private void initSpringView() {
mSpringView.setHeader(new DefaultHeader(mContext));
mSpringView.setFooter(new DefaultFooter(mContext));
mSpringView.setType(SpringView.Type.FOLLOW);
}
/**
* 用于初始listView
*/
private void initListView() {
mMyNewsPagerAdapter = new MyNewsPagerAdapter();
mListView.setAdapter(mMyNewsPagerAdapter);
}
/**
* 1,初次加载数据
* 步骤:
* 1,获取网络请求地址
* 2,网络请求获取返回的字符串response
* 3,通过xmlUtils将response解析javaBean
* 4,对请求的数据进行健壮性判断
* 5,更新数据集合,更新适配器,请求页的索引加1
*/
private void initLoadData() {
//初始化集合
mData = new ArrayList<>();
//http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
mTweetsPagerProtocol = new TweetsPagerProtocol();
mTweetsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
mTweetsPagerProtocol.loadGetData(this, INITDATA);
}
/**
* 2,下拉刷新
* 与初次加载数据的区别
* 1,每次请求页的索引值为0
* 2,清空数据集中的数据,不清除的话每次都会添加
* 3,请求成功后要关闭SrpingView
*/
private void onDealRefresh() {
//将请求页的索引值赋值为0
mCurrentPageIndex = 0;
//清空数据集合中的数据,不然每次下拉刷新,加载的数据都一样,并且更新到ListView中
mData.clear();
mSpringView.onFinishFreshAndLoad();
mTweetsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
mTweetsPagerProtocol.loadGetData(this,REFRESHDATA);
}
/**
* 3,加载更多
* 注意事项:
* 请求成功数据更新之后,要关闭SpringView
*/
private void onDealLoadmore() {
mSpringView.onFinishFreshAndLoad();
mTweetsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
mTweetsPagerProtocol.loadGetData(this, LOADMOREDATA);
}
@Override
public void onError(Call call, Exception e, int id, int dataState) {
//失败的时候,也要关闭SpringView
mSpringView.onFinishFreshAndLoad();
switch (dataState){
case INITDATA:
Toast.makeText(mContext, "数据加载失败", Toast.LENGTH_SHORT).show();
break;
case REFRESHDATA:
Toast.makeText(mContext, "下拉刷新失败", Toast.LENGTH_SHORT).show();
break;
case LOADMOREDATA:
Toast.makeText(mContext, "上拉加载失败", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
@Override
public void onResponse(TweetsList tweetsList, int id, int dataType) {
if (tweetsList != null) {
//获取刷新的数据集合
List<Tweet> list = tweetsList.getList();
//健壮性判断
if (list != null && list.size() > 0) {
//更新数据集合
mData.addAll(list);
//更新适配器
mMyNewsPagerAdapter.notifyDataSetChanged();
//更新页数的索引值
mCurrentPageIndex ++ ;
}
}
}
根据TweetPagerFragment抽取的基类BaseRfreshFragment
/**
* Author: 归零
* Date: 2017/3/5 0:59
* Email: 4994766@qq.com
* Description:
*/
public abstract class BaseRfreshFragment<RESTYPE,ITEMBEAN> extends BaseFragment implements BaseProtocol.Callback<RESTYPE> {
protected static final int INITDATA = 0;
protected static final int REFRESHDATA = 1;
protected static final int LOADMOREDATA = 2;
@BindView(R.id.list_view)
protected ListView mListView;
@BindView(R.id.spring_view)
protected SpringView mSpringView;
protected ArrayList<ITEMBEAN> mData;
protected BaseAdapter mBaseAdapter;
protected int mCurrentPageIndex;
protected BaseProtocol<RESTYPE> mBaseProtocol;
@Override
protected View initView() {
return View.inflate(mContext, R.layout.fragment_news_pager, null);
}
@Override
protected void initData() {
super.initData();
//初次加载数据
initLoadData();
initListView();
initSpringView();
}
@Override
protected void initEvent() {
super.initEvent();
mSpringView.setListener(new SpringView.OnFreshListener() {
@Override
public void onRefresh() {
//下拉刷新
onDealRefresh();
}
@Override
public void onLoadmore() {
//加载更多数据
onDealLoadmore();
}
});
}
/**
* 设置SpringView的下拉刷新和上拉加载的布局
* 设置SpringView的样式
*/
private void initSpringView() {
mSpringView.setHeader(new DefaultHeader(mContext));
mSpringView.setFooter(new DefaultFooter(mContext));
mSpringView.setType(SpringView.Type.FOLLOW);
}
/**
* 用于初始listView
*/
private void initListView() {
mBaseAdapter = getAdapter();
mListView.setAdapter(mBaseAdapter);
}
/**
* 1,初次加载数据
* 步骤:
* 1,获取网络请求地址
* 2,网络请求获取返回的字符串response
* 3,通过xmlUtils将response解析javaBean
* 4,对请求的数据进行健壮性判断
* 5,更新数据集合,更新适配器,请求页的索引加1
*/
private void initLoadData() {
//初始化集合
mData = new ArrayList<>();
//http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
// mBaseProtocol = getProtocol();
mBaseProtocol = getProtocol();
mBaseProtocol.setCurrentPageIndex(mCurrentPageIndex);
mBaseProtocol.loadGetData(this, INITDATA);
}
/**
* 2,下拉刷新
* 与初次加载数据的区别
* 1,每次请求页的索引值为0
* 2,清空数据集中的数据,不清除的话每次都会添加
* 3,请求成功后要关闭SrpingView
*/
private void onDealRefresh() {
//将请求页的索引值赋值为0
mCurrentPageIndex = 0;
//清空数据集合中的数据,不然每次下拉刷新,加载的数据都一样,并且更新到ListView中
mData.clear();
mSpringView.onFinishFreshAndLoad();
mBaseProtocol.setCurrentPageIndex(mCurrentPageIndex);
mBaseProtocol.loadGetData(this, REFRESHDATA);
}
/**
* 3,加载更多
* 注意事项:
* 请求成功数据更新之后,要关闭SpringView
*/
private void onDealLoadmore() {
mSpringView.onFinishFreshAndLoad();
mBaseProtocol.setCurrentPageIndex(mCurrentPageIndex);
mBaseProtocol.loadGetData(this, LOADMOREDATA);
}
@Override
public void onError(Call call, Exception e, int id, int dataState) {
//失败的时候,也要关闭SpringView
mSpringView.onFinishFreshAndLoad();
switch (dataState) {
case INITDATA:
Toast.makeText(mContext, "数据加载失败", Toast.LENGTH_SHORT).show();
break;
case REFRESHDATA:
Toast.makeText(mContext, "下拉刷新失败", Toast.LENGTH_SHORT).show();
break;
case LOADMOREDATA:
Toast.makeText(mContext, "上拉加载失败", Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
@Override
public void onResponse(RESTYPE restype, int id, int dataType) {
if (restype != null) {
//获取刷新的数据集合
List<ITEMBEAN> list = getDataList(restype);
//健壮性判断
if (list != null && list.size() > 0) {
//更新数据集合
mData.addAll(list);
//更新适配器
mBaseAdapter.notifyDataSetChanged();
//更新页数的索引值
mCurrentPageIndex++;
}
}
}
/**
* 决定封装的网络请求
* 在BaseRfreshFragment中不知道具体的实现,交给子类实现
* 子类必须实现
* @return
*/
protected abstract BaseProtocol getProtocol() ;
/**
* 决定ListView,使用的适配器
* 在BaseRfreshFragment中不知道具体的实现,交给子类实现
* 子类 必须实现
* @return
*/
protected abstract BaseAdapter getAdapter();
/**
* 决定每次请求的新的数据集合
* 在BaseRefreshFragment中不知道具体的实现 交给子类实现
* 子类必须实现
* @param restype
* @return
*/
protected abstract List<ITEMBEAN> getDataList(RESTYPE restype);
}
最后
以上就是慈祥山水为你收集整理的11,ListView+SpringView+网络数据统一处理+基类的抽取的全部内容,希望文章能够帮你解决11,ListView+SpringView+网络数据统一处理+基类的抽取所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复