要实现的效果
1,初始化数据
2,下拉刷新
3,上拉加载
UI
用到的主要控件
SpringView
1,带有下拉刷新,上拉加载的功能
2,带有下拉刷新和上拉加载的监听器
3,带有多种头和尾的UI效果
注意事项:
SpringView可以在代码中Header和Footer的效果
SpringView也可以在代码中设置样式
样式与Header,Footer可能存在冲突
ListView
1,用于展示条目数据
UI布局
<com.liaoinstan.springview.widget.SpringView
android:id="@+id/spring_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.liaoinstan.springview.widget.SpringView>
网络数据的处理
初始化网络数据的加载
1,初始化数据集合
2,获取网络请求的url
3,隐藏SpringView,因为不管成功,失败都要隐藏SpringView
4,使用OkHttpUtils进行get请求获取xml字符串
1,请求失败
1,弹Toast
2,请求成功
1,使用XmlUtils工具类,将xml字符串转换成javaBean,并获取里面的list集合
2,对javaBean进行非空判断,再对list集合进行非空判断和集合大小大于0进行判断
3,更新数据集,将新的集合添加到已有的集合中
4,更新适配器
5,页数的索引值++
下拉刷新的网络数据加载
1,页数的索引值赋值为0
2,清空集合中的数据,因为如果不清空,每次下拉刷新,集合数据都会重复添加,并更新到界面
3,获取网络请求的url
4,隐藏SpringView,因为不管成功,失败都要隐藏SpringView
5,使用OkHttpUtils进行get请求获取xml字符串
1,请求失败
1,弹Toast
2,请求成功
1,使用XmlUtils工具类,将xml字符串转换成javaBean,并获取里面的list集合
2,对javaBean进行非空判断,再对list集合进行非空判断和集合大小大于0进行判断
3,更新数据集,将新的集合添加到已有的集合中
4,更新适配器
5,页数的索引值++
注意事项:
1,清空数据集合
2,要隐藏SpringView
3,对返回数据的健壮性判断
上拉加载网络数据的加载
1,获取网络请求的url
2,隐藏SpringView,因为不管成功,失败都要隐藏SpringView
3,使用OkHttpUtils进行get请求获取xml字符串
1,请求失败
1,弹Toast
2,请求成功
1,使用XmlUtils工具类,将xml字符串转换成javaBean,并获取里面的list集合
2,对javaBean进行非空判断,再对list集合进行非空判断和集合大小大于0进行判断
3,更新数据集,将新的集合添加到已有的集合中
4,更新适配器
5,页数的索引值++
注意事项:
1,要隐藏SpringView
2,对返回数据的健壮性判断
网络数据处理的代码实现
/**
* 1,初次加载数据
* 步骤:
* 1,获取网络请求地址
* 2,网络请求获取返回的字符串response
* 3,通过xmlUtils将response解析javaBean
* 4,对请求的数据进行健壮性判断
* 5,更新数据集合,更新适配器,请求页的索引加1
*/
private void initLoadData() {
mData = new ArrayList<>();
String newsUrl = Constant.NEWS_URL;
OkHttpUtils
.get()
.url(newsUrl)
.addParams("pageIndex", mCurrentPageIndex + "")
.addParams("catalog", "1")
.addParams("pageSize", "20")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(mContext, "数据初始化失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response, int id) {
NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(newsList.getList());
mMyNewsPagerAdapter.notifyDataSetChanged();
++mCurrentPageIndex;
}
}
}
});
}
/**
* 2,下拉刷新
* 与初次加载数据的区别
* 1,每次请求页的索引值为0
* 2,清空数据集中的数据,不清除的话每次都会添加
* 3,请求成功后要关闭SrpingView
*
*/
private void onDealRefresh() {
mCurrentPageIndex = 0;
mData.clear();
String newsUrl = Constant.NEWS_URL;
mSpringView.onFinishFreshAndLoad();
OkHttpUtils
.get()
.url(newsUrl)
.addParams("pageIndex", mCurrentPageIndex + "")
.addParams("catalog", "1")
.addParams("pageSize", "20")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(mContext, "下拉刷新失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response, int id) {
NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(newsList.getList());
mMyNewsPagerAdapter.notifyDataSetChanged();
++mCurrentPageIndex;
}
}
}
});
}
/**
* 3,加载更多
* 注意事项:
* 请求成功数据更新之后,要关闭SpringView
*/
private void onDealLoadmore() {
String newsUrl = Constant.NEWS_URL;
mSpringView.onFinishFreshAndLoad();
OkHttpUtils
.get()
.url(newsUrl)
.addParams("pageIndex", mCurrentPageIndex + "")
.addParams("catalog", "1")
.addParams("pageSize", "20")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(mContext, "上拉加载失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response, int id) {
NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(newsList.getList());
mMyNewsPagerAdapter.notifyDataSetChanged();
++mCurrentPageIndex;
}
}
}
});
}
带有适配器的整个代码的实现
package com.example.guixin.oschina.fragment.pager;
import android.graphics.Color;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import com.example.guixin.oschina.base.BaseFragment;
import com.example.guixin.oschina.bean.Constant;
import com.example.guixin.oschina.bean.News;
import com.example.guixin.oschina.bean.NewsList;
import com.example.guixin.oschina.util.XmlUtils;
import com.liaoinstan.springview.container.DefaultFooter;
import com.liaoinstan.springview.container.DefaultHeader;
import com.liaoinstan.springview.widget.SpringView;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.StringCallback;
import net.oschina.app.R;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import okhttp3.Call;
/**
* 类 名: ${CLASS_NAME}
* 创 建 者: guixin
* 创建时间: 2017/3/2 15:49
* 更新者 : $$Author$$
* 版 本: $$Rev$$
* 更新时间: $$Date$$
* 描 述: Data+View
*/
public class NewsPagerFragment extends BaseFragment {
@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;
@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<>();
String newsUrl = Constant.NEWS_URL;
OkHttpUtils
.get()
.url(newsUrl)
.addParams("pageIndex", mCurrentPageIndex + "")
.addParams("catalog", "1")
.addParams("pageSize", "20")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(mContext, "数据初始化失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response, int id) {
NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(newsList.getList());
mMyNewsPagerAdapter.notifyDataSetChanged();
++mCurrentPageIndex;
}
}
}
});
}
/**
* 2,下拉刷新
* 与初次加载数据的区别
* 1,每次请求页的索引值为0
* 2,清空数据集中的数据,不清除的话每次都会添加
* 3,请求成功后要关闭SrpingView
*
*/
private void onDealRefresh() {
mCurrentPageIndex = 0;
mData.clear();
String newsUrl = Constant.NEWS_URL;
mSpringView.onFinishFreshAndLoad();
OkHttpUtils
.get()
.url(newsUrl)
.addParams("pageIndex", mCurrentPageIndex + "")
.addParams("catalog", "1")
.addParams("pageSize", "20")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(mContext, "下拉刷新失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response, int id) {
NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(newsList.getList());
mMyNewsPagerAdapter.notifyDataSetChanged();
++mCurrentPageIndex;
}
}
}
});
}
/**
* 3,加载更多
* 注意事项:
* 请求成功数据更新之后,要关闭SpringView
*/
private void onDealLoadmore() {
String newsUrl = Constant.NEWS_URL;
mSpringView.onFinishFreshAndLoad();
OkHttpUtils
.get()
.url(newsUrl)
.addParams("pageIndex", mCurrentPageIndex + "")
.addParams("catalog", "1")
.addParams("pageSize", "20")
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
Toast.makeText(mContext, "上拉加载失败", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(String response, int id) {
NewsList newsList = XmlUtils.toBean(NewsList.class, response.getBytes());
if (newsList != null) {
List<News> list = newsList.getList();
if (list != null && list.size() > 0) {
mData.addAll(newsList.getList());
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;
}
}
}