SmartRefreshLayout+RecyclerView

2018-05-15  本文已影响0人  Gemini_Cc

记一次SmartRefreshLayout+RecyclerView 实现上拉加载更多和下拉刷新心得。

SmartRefreshLayout是一个比较强大的上拉加载更多和下拉刷新库 (附链接:点击打开链接

不详解SmartRefreshLayout和RecyclerView的使用方法。贴一部分代码出来

private void initView() {  
       LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);  
       linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);  
       recyclerView.setLayoutManager(linearLayoutManager);  
       baseAdapter = new BaseAdapter(this, list);  
       baseAdapter.setOnItemClickListener(new BaseAdapter.OnItemClickListener() {  
           @Override  
           public void onItemClick(View view, int position) {  
           }  
       });  
       recyclerView.setAdapter(baseAdapter);  
  
       //设置 Header  
       refreshLayout.setRefreshHeader(new ClassicsHeader(this));  
       //设置 Footer 为 球脉冲 样式  
       refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));  
       refreshLayout.setEnableAutoLoadMore(true);  
       refreshLayout.setScrollBoundaryDecider(new ScrollBoundaryDecider() {  
           @Override  
           public boolean canRefresh(View content) {  
              ...  
           }  
  
           @Override  
           public boolean canLoadMore(View content) {  
              ...  
           }  
       });  
       refreshLayout.setOnRefreshListener(new OnRefreshListener() {  
           @Override  
           public void onRefresh(RefreshLayout refreshlayout) {  
               ...  
           }  
       });  
       refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {  
           @Override  
           public void onLoadMore(RefreshLayout refreshlayout) {  
                ...  
           }  
       });  
  
   }  

问题:

在实现 上拉加载更多 和 下拉刷新 时 遇到item不在顶端就执行了刷新的方法和数据item没有填满屏幕也执行了加载更多。

这里需要利用

SmartRefreshLayout中的setScrollBoundaryDecider()方法设置滚动边界判断。代码如下

refreshLayout.setScrollBoundaryDecider(new ScrollBoundaryDecider() {  
           @Override  
           public boolean canRefresh(View content) {  
               if (recyclerView == null) return false;  
               if (recyclerView.computeVerticalScrollOffset()==0)  
                   return true;  
               return false;  
           }  
  
           @Override  
           public boolean canLoadMore(View content) {  
               if (recyclerView == null) return false;  
               //获取recyclerView的高度  
               recyclerView.getHeight();  
               //整个View控件的高度  
               int scrollRange = recyclerView.computeVerticalScrollRange();  
               //当前屏幕之前滑过的距离  
               int scrollOffset = recyclerView.computeVerticalScrollOffset();  
               //当前屏幕显示的区域高度  
               int scrollExtent = recyclerView.computeVerticalScrollExtent();  
               int height = recyclerView.getHeight();  
               if(height>scrollRange){  
                   return false;  
               }  
               if (scrollRange <=scrollOffset+scrollExtent){  
                   return true;  
               }  
               return false;  
           }  
       });  

这种方法原理其实很简单,而且也是View自带的方法。


image

omputeVerticalScrollExtent()是当前屏幕显示的区域高度,computeVerticalScrollOffset() 是当前屏幕之前滑过的距离,而computeVerticalScrollRange()是整个View控件的高度。

所以我们只要通过判断Scroll和RecycleView的高度来判断是否在顶端和item是否达到了底端。

在setScrollBoundaryDecider()方法中new ScrollBoundaryDecider(),并重写canLoadMore和canRefresh方法。

代码不做讲解,就是简单的算法。

上一篇下一篇

猜你喜欢

热点阅读