美文网首页
SmartRefreshLayout+RecyclerView

SmartRefreshLayout+RecyclerView

作者: Gemini_Cc | 来源:发表于2018-05-15 17:54 被阅读0次

    记一次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方法。

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

    相关文章

      网友评论

          本文标题:SmartRefreshLayout+RecyclerView

          本文链接:https://www.haomeiwen.com/subject/disydftx.html