android中RecycleView添加下滑到底部的监听示例

作者:mingyunxiaohai 时间:2022-06-21 17:02:08 

我们的日常开发中经常用到下拉刷新,而网上评价最好的开源下拉刷新组件当然还是android-Ultra-Pull-To-Refresh 此组件可以给任何的控件添加下拉刷新功能。当然也包括recycleview了。

可惜android-Ultra-Pull-To-Refresh只是提供了下拉刷新的功能,但是对于列表类的组件,我们日常开发中更多的会用到其上拉加载或者滑到底部自动加载的功能,当然目前来看用户更喜欢滑到底部自动加载的功能。就比如今天说的recycleview我们只能自己给其添加滑到底部加载更多的功能了。

那它的实现原理是神马呢 非常简单:

RecycleView内部有一个滑动监听的抽象类OnScrollListener来接收滚动事件,此类里面有两个实现的方法


public abstract static class OnScrollListener {
   /**
    * Callback method to be invoked when RecyclerView's scroll state changes.
    *
    * @param recyclerView The RecyclerView whose scroll state has changed.
    * @param newState   The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
    *           {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
    */
   public void onScrollStateChanged(RecyclerView recyclerView, int newState){}

/**
    * Callback method to be invoked when the RecyclerView has been scrolled. This will be
    * called after the scroll has completed.
    * <p>
    * This callback will also be called if visible item range changes after a layout
    * calculation. In that case, dx and dy will be 0.
    *
    * @param recyclerView The RecyclerView which scrolled.
    * @param dx The amount of horizontal scroll.
    * @param dy The amount of vertical scroll.
    */
   public void onScrolled(RecyclerView recyclerView, int dx, int dy){}
 }

通多源码的注释可以了解到

onScrollStateChanged 当recyclerview的滚动状态发生变化的时候调用。

onScrolled 在布局可见和recycleview滚动的时候调用。

那么思路就是:

(1)在onScrollStateChanged 方法中判断当前的滚动状态是停止滚动的状态。

(2)然后根据api中的方法获得最后可见的位置。

(3)判断当前可见的recycleview中item的条数大于0

(4)判断最后可见的位置大于数大于item总数减一

(5)并且item的总数大于可见的item 这样可以保证超过一个界面的时候才执行。

当满足让面的要求的时候我们就可以通过接口回调执行我们的耗时逻辑 ,并显示出加载的dialog。

因为RecyclerView可以通过layoutManager灵活的转换成列表,表格,和瀑布流。尤其是瀑布流的时候,它的最后可见的位置是不一样的,所以我们必须根据其不同的layoutManager状态获取相对应的最后可见位置。

代码:


@Override
 public void onScrollStateChanged(int state) {
   if (state == RecyclerView.SCROLL_STATE_IDLE && mLoadingListener != null) {
     LayoutManager layoutManager = getLayoutManager();
     int lastVisibleItemPosition;
     if (layoutManager instanceof GridLayoutManager) {
       lastVisibleItemPosition = ((GridLayoutManager) layoutManager).findLastVisibleItemPosition();
     } else if (layoutManager instanceof StaggeredGridLayoutManager) {
       int[] into = new int[((StaggeredGridLayoutManager) layoutManager).getSpanCount()];
       ((StaggeredGridLayoutManager) layoutManager).findLastVisibleItemPositions(into);
       lastVisibleItemPosition = findMax(into);
     } else {
       lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition();
     }
     if (layoutManager.getChildCount() > 0
         && lastVisibleItemPosition >= layoutManager.getItemCount() - 1 && layoutManager.getItemCount() > layoutManager.getChildCount()) {
         View footView = mFootViews.get(0);
       footView.setVisibility(View.VISIBLE);
       mLoadingListener.onLoadMore();
     }
   }
 }

我们可以通过api获取瀑布流的所有的列 ,通过下面的方法找出最下面的一列。将加载的dialog显示在此列的下面。


private int findMax(int[] lastPositions) {
   int max = lastPositions[0];
   for (int value : lastPositions) {
     if (value > max) {
       max = value;
     }
   }
   return max;
 }

来源:http://blog.csdn.net/mingyunxiaohai/article/details/65936751

标签:recycleview,android
0
投稿

猜你喜欢

  • 详解记录Java Log的几种方式

    2022-11-10 16:38:19
  • SpringBoot+Jpa项目配置双数据源的实现

    2022-11-01 14:05:04
  • Java关系操作符简写介绍

    2023-12-25 12:56:29
  • C#中将DataTable转化成List<T>的方法解析

    2023-02-06 23:20:39
  • Spring Boot修改内置Tomcat默认端口号的示例

    2023-03-29 21:11:40
  • Android权限操作之uses-permission详解

    2023-07-20 17:07:02
  • java实现分布式项目搭建的方法

    2022-10-13 10:42:36
  • 详解Java编程中包package的内容与包对象的规范

    2022-03-06 17:48:08
  • Java 网络爬虫基础知识入门解析

    2022-05-16 02:39:06
  • Android实现沉浸式状态栏功能

    2022-10-25 23:19:36
  • 使用Spring自定义注解实现任务路由的方法

    2023-12-20 22:34:11
  • JAVA算法起步之插入排序实例

    2021-05-30 15:52:30
  • 浅谈C# 中的委托和事件

    2021-06-06 18:53:07
  • IDEA解决springboot热部署失效问题(推荐)

    2023-08-12 10:40:49
  • SpringBoot JPA实现增删改查、分页、排序、事务操作等功能示例

    2023-06-27 23:54:05
  • Java如何去掉指定字符串的开头的指定字符

    2022-05-23 13:28:31
  • WPF中NameScope的查找规则详解

    2023-01-18 14:22:02
  • Spring注解@Configuration与@Bean注册组件的使用详解

    2022-09-13 01:52:56
  • Spring集成MyBatis 及Aop分页的实现代码

    2022-01-06 14:30:47
  • C#警惕匿名方法造成的变量共享实例分析

    2021-08-26 19:35:22
  • asp之家 软件编程 m.aspxhome.com