对网络数据统一处理的原因:
初始化数据,刷新数据,加载数据,都需要进行网络请求
如果不统一处理,冗余代码过多
解决方法:
1,创建3个常量 ,用来记录3种状态,并将状态在请求的时候,传递给封装的网络请求,并在接口回调方法时传回来
2,让NewsPagerFragment实现封装的网络请求的接口
3,重写onError和onResponse方法,使用switch来判断
4,onError,每种状态返回的结果不一样
5,onResponse,每种状态,返回的都是
1,更新数据
2,更新适配器
3,更新页面的索引值
注意事项
初始化数据:
1,初始化数据集合
2,网络get请求
1,更新数据
2,更新适配器
3,更新页面的索引值
下拉刷新数据:
1,赋值页数为索引值为0
2,清空数据集合(一定要清空,不然每次刷新都是重复的一页数据)
3,关闭SpringView,将下拉刷新隐藏
4,网络get请求
1,更新数据
2,更新适配器
3,更新页面的索引值
上拉加载数据:
1,关闭SpringView,将上拉加载隐藏
2,网络get请求
1,更新数据
2,更新适配器
3,更新页面的索引值
优化后的代码
public class NewsPagerFragment extends BaseFragment implements BaseProtocol.Callback<NewsList> {
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<News> mData;
private Handler mHandler = new Handler();
private MyNewsPagerAdapter mMyNewsPagerAdapter;
private int mCurrentPageIndex;
private NewsPagerProtocol mNewsPagerProtocol;
@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<>();
mNewsPagerProtocol = new NewsPagerProtocol();
mNewsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
mNewsPagerProtocol.loadGetData(this, INITDATA);
}
/**
* 2,下拉刷新
* 与初次加载数据的区别
* 1,每次请求页的索引值为0
* 2,清空数据集中的数据,不清除的话每次都会添加
* 3,请求成功后要关闭SrpingView
*/
private void onDealRefresh() {
mCurrentPageIndex = 0;
mData.clear();
mSpringView.onFinishFreshAndLoad();
mNewsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
mNewsPagerProtocol.loadGetData(this,REFRESHDATA);
}
/**
* 3,加载更多
* 注意事项:
* 请求成功数据更新之后,要关闭SpringView
*/
private void onDealLoadmore() {
mSpringView.onFinishFreshAndLoad();
mNewsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
mNewsPagerProtocol.loadGetData(this, LOADMOREDATA);
}
@Override
public void onError(Call call, Exception e, int id,int dataState) {
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(NewsList newsList, int id, int dataType) {
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(list);
mMyNewsPagerAdapter.notifyDataSetChanged();
mCurrentPageIndex ++ ;
}
}
}
/**
* 设置ListView使用到的适配器
*/
class MyNewsPagerAdapter extends BaseAdapter {
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
}
@Override
public Object getItem(int i) {
return mData == null ? null : mData.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
TextView tv = new TextView(getContext());
tv.setGravity(Gravity.CENTER);
tv.setTextColor(Color.BLUE);
tv.setText(this.getClass().getSimpleName());
tv.setText(mData.get(i).getBody());
return tv;
}
}
}