Android知识Android开发Android技术知识

RecyclerView滑动监听(三)

2017-03-10  本文已影响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);  //关键方法
上一篇 下一篇

猜你喜欢

热点阅读