private void init() { //布局设置 mRvNewListLayout.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)); //设置 数据 mNewsListAdapter = new NewsListAdapter(mShowItems); mRvNewListLayout.setAdapter(mNewsListAdapter); //设置下拉刷新 mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { if (mLOADSTATE == LOADSTATE.NONE) { mLOADSTATE = LOADSTATE.LOADING; refresh(); } else { ToastUtil.showToast("亲,正在下拉中,请勿刷新"); } //下拉刷新 //重新请求数据 //使用框架重新请求数据 } }); mRvNewListLayout.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); //只有现行布局才能找到最后一条,通过布局管理器,获取最后一个条目 if (mLOADSTATE == LOADSTATE.NONE) { LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int lastVisibleItemPosition = linearLayoutManager.findLastVisibleItemPosition(); if (lastVisibleItemPosition == mShowItems.size() - 1 && newState == RecyclerView.SCROLL_STATE_IDLE) { //请求数据,刷新数据 ,刷新数据前告诉系统刷新的状态 mLOADSTATE = LOADSTATE.MORELOADING; //上拉加载 refresh(); } } else { ToastUtil.showToast("别再扯犊子了"); } } }); } public enum LOADSTATE { //定义刷新的状态 范围确定,总共只有这几种状态 NONE, //空闲 LOADING , //下拉刷新 MORELOADING // 上拉加载更多 } //定义当前的状态 private LOADSTATE mLOADSTATE = LOADSTATE.NONE; @Override protected Object rquestData() { //recyclerView操作数据永远在请求数据之后 //请求头部 //不是上拉刷新的时候,才去请求头布局 if (mLOADSTATE!= LOADSTATE.MORELOADING) { newHeadBean = LoadData.getInstance().getBeanData("http://www.oschina.net/action/apiv2/banner?catalog=1", NewHeadBean.class); } String requestUrl = "http://www.oschina.net/action/apiv2/news?pageToken="; //根据当前的的状态请求我们的地址 if (mLOADSTATE == LOADSTATE.MORELOADING) { requestUrl = requestUrl + mpageToken; } else { requestUrl = "http://www.oschina.net/action/apiv2/news?pageToken="; } //请求身体 NewBodyBean newBodyBean = LoadData.getInstance().getBeanData(requestUrl, NewBodyBean.class); //为了防止空指针,进行判空 if (newBodyBean != null && newBodyBean.getResult() != null && newBodyBean.getResult().getNextPageToken() != null) { mpageToken = newBodyBean.getResult().getNextPageToken(); //下一页 } //数据判断的逻辑 if (mShowItems.size() > 0) { //添加的数据跟身体有关,与头部无关 if (newBodyBean != null && newBodyBean.getResult() != null && newBodyBean.getResult().getItems() != null && newBodyBean.getResult().getItems().size() > 0) { if (mLOADSTATE != LOADSTATE.MORELOADING) { mShowItems.clear(); } mShowItems.addAll(newBodyBean.getResult().getItems()); } else { ToastUtil.showToast("网络异常,加载失败"); } } else { if (newBodyBean != null && newBodyBean.getResult() != null && newBodyBean.getResult().getItems() != null && newBodyBean.getResult().getItems().size() > 0) { //直接添加数据 mShowItems.addAll(newBodyBean.getResult().getItems()); } else { //不处理也行,处理就返回null return null; } } //处理头部了 mShowItems.add(0,newHeadBean); //判断当前下拉的模式 // //在上拉加载更多时候不会清空数据 // if (mLOADSTATE != LOADSTATE.MORELOADING ) { // mShowItems.clear(); // } // //在加载数据之前,把头部和脚步数据干掉 // for (int i = 0; i < mShowItems.size(); i++) { // if (mShowItems.get(i) instanceof HeadType) { // mShowItems.remove(i); // } // } //这么写太麻烦了,考虑一个方法,自动的加进去 //头部应该加在0的位置 // mShowItems.add(0,newHeadBean); // // mShowItems.addAll(newBodyBean.getResult().getItems()); //底部必须手动 // mShowItems.add(new FootBean()); //更新adapter Utils.runOnUIThread(new Runnable() { @Override public void run() { //刷新 // mNewsListAdapter.notifyDataSetChanged(); //停止刷新的方法 mNewsListAdapter.updataData(); //更改状态 mLOADSTATE = LOADSTATE.NONE; mSwipeRefreshLayout.setRefreshing(false); //注意状态的反转 } }); return mShowItems; }
Android app开发中刷新问题的详解
最新推荐文章于 2024-06-27 22:39:01 发布