RecyclerView滑动监听(三)

作者: 难得糊涂与君勉 | 来源:发表于2017-03-10 10:22 被阅读8150次

    前言

    这里介绍了RecyclerView的下拉刷新和分页加载两项功能,别的请参照:
    RecyclerView(一)
    RecyclerView加点击事件(二)
    RecyclerView之横向展示(四)
    RecyclerView之瀑布流(五)
    RecyclerView优化

    下拉刷新

    SwipeRefreshLayout
    这是谷歌官方推荐的搭配的方法。

    需要使用android.support.V4.widget.SwipeRefreshlayout
    

    监听方法

    swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    //在这里不会直接更新,还需要你手动去调用刷新的方法
                }
            });
    

    可以设置刷新圆圈的颜色

    swipeRefreshLayout.setColorSchemeColors(Color.RED,Color.BULE);
    //这里面设置颜色最多是四个,可以实现转一个圈显示一个颜色
    

    可以设置刷新圆圈出来的位置

    swipeRefreshlayout.setProgressViewOffset(true,200,300);
    //实现的功能是,true:会收缩,参数二是开始的位置,参数三是结束的位置
    //形成一种收缩移动的动画既视感
    

    可以设置圆圈消失

    swipeRefreshlayout.setRefreshing(false);
    

    分页加载

    介绍
    很多人直接会用系统提供的addOnScrollListener()方法,如下所示:

    myRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
               public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                   super.onScrollStateChanged(recyclerView, newState);  
                  if (newState == RecyclerView.SCROLL_STATE_IDLE){
                      /**new State 一共有三种状态
                     * SCROLL_STATE_IDLE:目前RecyclerView不是滚动,也就是静止
                     * SCROLL_STATE_DRAGGING:RecyclerView目前被外部输入如用户触摸输入。
                     * SCROLL_STATE_SETTLING:RecyclerView目前动画虽然不是在最后一个位置外部控制。
                     //这里进行加载更多数据的操作
                   }
                }
            });  
    

    弊端
    上述方法类似与ViewPager的滑动监听,只要你一滑动RecyclerView,那么就会调用,
    如上述的约束条件,只要动了,就会就会静止,就会调用,哪怕你没有到ReyclerView
    数据的底部,所以不可取

    解决
    需要对这个监听进行约束,首先定义新的类,在Adaper类中,不是当做内部类

    class OnlastItem extends RecyclerView.OnScrollListener{
        boolean isButton =false;
    }
    //关键,一定要继承RecyclerView.OnScrollListener接口
    

    在Adapter类中一定要重写onViewAttachedToWindow()方法

    @Override
     public void onViewAttachedToWindow(MyViewHodler holder) {
         super.onViewAttachedToWindow(holder);
         int positon = holder.getLayoutPosition();
         if (positon == list.size()-1){
                 onlastItem.isButton =true;
         }
     }
    

    上述方法介绍

    Called when a view created by this adapter has been attached to a window.
    这个方法会频繁的调用,只要一个屏幕外的item进入当前视野,就会调用,但是有一点需要注意的是,
    window指的是当前可见的视图,一个item 哪怕,你只看到一点点,那么也算是进入了屏幕上了,
    就是所谓的window 上了。
    那么你初始化展示了RecyclerView的内容后,这个方法也会根据在window上可见的数目,调用相应的次数。
    

    继续上述步骤
    在Adapter类中:

        //持有滑动的变量
        private OnlastItem onlastItem;
        //对外暴露其方法
        public void setOnlastItem(OnlastItem onlastItem) {
            this.onlastItem = onlastItem;
        }
    

    给RecyclerView设置监听方法

            //滑动监听
            OnlastItem on = new OnlastItem(){
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                    /*当RecyclerView滚动。这将是
                     称为滚动后完成。这个回调也被称为后如果可见项目范围改变布局
                     计算。在这种情况下,dx和dy将0。
                     dx表示水平滚动,dy表示垂直滚动*/
                }
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    super.onScrollStateChanged(recyclerView, newState);
           
                       要调用的回调方法当RecyclerView滚动状态改变。
                    /**new State 一共有三种状态
                     * SCROLL_STATE_IDLE:目前RecyclerView不是滚动。
                     * SCROLL_STATE_DRAGGING:RecyclerView目前被外部输入如用户触摸输入。
                     * SCROLL_STATE_SETTLING:RecyclerView目前动画虽然不是在最后一个位置
                                              外部控制。
                     * */
                
                    if (newState == RecyclerView.SCROLL_STATE_IDLE&&isButton==true){
                        //这里用不是滚动状态的实现,并且还有一个判断,是退出屏幕了
                        if (newState == RecyclerView.SCROLL_STATE_IDLE){
                            //进行联网数据操作
                            isButton =false;//这个置反很关键
                        }
                    }
                }
            };
            myRecyclerView.addOnScrollListener(on);  //关键方法
            liAdater.setOnlastItem(on);  //关键方法
    

    相关文章

      网友评论

        本文标题:RecyclerView滑动监听(三)

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