Android RecyclerView实现下拉刷新和上拉加载

2019-12-10 18:00:17于海丽

*onScrollStateChanged(RecyclerView recyclerView, int newState):滑动状态的回调。

那么,我们的着重点就在这个两个方法上了。

对于向上加载更多,我们需要有如下判断

--是否是向上滑动

--是否滑动到底部

--当前是否正在加载数据

--当前状态是否是滑动停止的状态

实现比较复杂,定义一个类LoadDataScrollController,继承类RecyclerView.OnScrollListener,

因为onScrollStateChanged实在状态改变时的回调,无法时时的获取显示的条目以及位置,所以我们在onScrolled中获取相应位置,

 @Override
  public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

    /**
     * 获取布局参数
     */
    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();

    //如果为null,第一次运行,确定布局类型
    if (mLayoutManagerType == null) {
      if (layoutManager instanceof LinearLayoutManager) {
        mLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT;
      } else if (layoutManager instanceof GridLayoutManager) {
        mLayoutManagerType = LayoutManagerType.GRID_LAYOUT;
      } else if (layoutManager instanceof StaggeredGridLayoutManager) {
        mLayoutManagerType = LayoutManagerType.STAGGERED_GRID_LAYOUT;
      } else {
        throw new RuntimeException("LayoutManager should be LinearLayoutManager,GridLayoutManager,StaggeredGridLayoutManager");
      }
    }

    //对于不太能够的布局参数,不同的方法获取到当前显示的最后一个条目数
    switch (mLayoutManagerType) {
      case LINEAR_LAYOUT:
        mLastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
        break;
      case GRID_LAYOUT:
        mLastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
        break;
      case STAGGERED_GRID_LAYOUT:
        StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
        if (mLastPostions == null) {
          mLastPostions = new int[staggeredGridLayoutManager.getSpanCount()];
        }
        staggeredGridLayoutManager.findLastVisibleItemPositions(mLastPostions);
        mLastVisibleItemPosition = findMax(mLastPostions);
        break;
      default:
        break;
    }

  }