11,ListView+SpringView+网络数据统一处理+基类的抽取

抽取的好处

减少代码量
逻辑更加清晰

抽取的注意事项

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);


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值