ListView + SpringView,实现条目的数据展示[网络数据统一处理版]

对网络数据统一处理的原因:

初始化数据,刷新数据,加载数据,都需要进行网络请求
如果不统一处理,冗余代码过多

解决方法:

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<>();
        //http://www.oschina.net/action/api/news_list?pageIndex=0&catalog=1&pageSize=20
        mNewsPagerProtocol = new NewsPagerProtocol();
        mNewsPagerProtocol.setCurrentPageIndex(mCurrentPageIndex);
        mNewsPagerProtocol.loadGetData(this, INITDATA);


    }

    /**
     * 2,下拉刷新
     * 与初次加载数据的区别
     * 1,每次请求页的索引值为0
     * 2,清空数据集中的数据,不清除的话每次都会添加
     * 3,请求成功后要关闭SrpingView
     */

    private void onDealRefresh() {
        //将请求页的索引值赋值为0
        mCurrentPageIndex = 0;
        //清空数据集合中的数据,不然每次下拉刷新,加载的数据都一样,并且更新到ListView中
        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;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值