GridPagerHelper 丝滑的翻页效果也许正是你想要的

590 阅读2分钟

GridPagerHelper

一款支持动态横竖模式加载更多、滑动惯性定位、页码计算的 RecyclerView 列表辅助器。

gridpagerhelper.gif

screenshot-20211223-145051.png

screenshot-20211223-145103.png

概述

需求在横屏、竖屏上支持加载更多,既要支持手滑分页、还要支持点击按钮前后翻页以及页码联动。调研了一下市面上有的加载更多库例如 smart 、 smooth 等,功能很强大,但是在横竖屏动态切换的时候就没有适配得更好,需要单独再包裹横向的 layout ,鉴于需求也不需要那么多功能即自定义。

功能&特性

  • 自定义加载更多

  • 预加载支持

  • 页码计算回调

  • 支持手动滑动翻页以及按钮点击翻页

  • 惯性定位可选

  • 轻量仅一个类不足 200 行代码

使用

    helper = new GridPagerHelper(recyclerView, new Config(15).snapStyle(SnapEnum.PAGER))
        .buildListener(new OnGridPagerHelperListener() {
          @Override
          public void onLoadMore() {
            
          }

          @Override
          public void onLoading() {

          }

          @Override
          public void onPageChanged(int page) {

          }
        });

//按钮翻页
 binding.left.setOnClickListener(v -> helper.smoothPreviousPage());
 binding.right.setOnClickListener(v -> helper.smoothNextPage());

API

方法名释义
release释放移除监听
setLoadCompleted设置加载状态
smoothNextPage翻下一页
smoothPreviousPage翻上一页
OnGridPagerHelperListener#onLoadMore加载更多
OnGridPagerHelperListener#onLoading加载中
OnGridPagerHelperListener#onPageChanged页码改变
Config#isPreLoad是否开启预加载
Config(int uiPageSize)构造#每页个数
SnapEnum(LINEAR,PAGER,NONE)滑动惯性定位[线性、翻页、空]

实现原理

  • 加载更多 自定义加载更多的实现是在 OnScrollListener#onScrollStateChanged(),中去判断最后一个可见的 position 是 adapter 中最后一个 item 即认为触底然后回调 loadMore 给外界

  • 页码联动 OnScrollListener#onScrollStateChanged()去做页码联动是不合适的,存在回调延时的情况(快速滑动列表),需要在 onScrolled 中进行 totalItem / 页size 进行页码计算以及回调

  • 上下翻页

上下翻页接口调用的 smoothScrollToPosition,具体实现很简单。见:

/**
 * 翻下一页
 */
public void smoothNextPage() {
  int i = lastVisiblePosition + uiPageSize;
  recyclerView.smoothScrollToPosition(i);
}

/**
 * 翻上一页
 */
public void smoothPreviousPage() {
  int i = firstVisiblePosition - uiPageSize;
  recyclerView.smoothScrollToPosition(i);
}

支持

  • Issue
  • QQ:623414533

源码

github.com/13120241790…