通过重写OnScrollListener来监听RecyclerView是否滑动到底部
为了增加复用性和灵活性,我们还是定义一个接口来做监听滚动到底部的回调,这样你就可以把它用在listview,scrollView中去。
OnBottomListener
package kale.com.waterfall; /**
* @author Jack Tony
* @brief
* @date 2015/4/6
*/
public interface OnBottomListener {
public void onBottom();
}
接着,我们来重写RecyclerView.OnScrollListener
package kale.com.waterfall.extra.RecyclerView; import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager; import kale.com.waterfall.OnBottomListener; /**
* @author Jack Tony
* @brief recyle view 滚动监听器
* @date 2015/4/6
*/
public class OnRcvScrollListener extends RecyclerView.OnScrollListener implements OnBottomListener { private String TAG = getClass().getSimpleName(); public static enum LAYOUT_MANAGER_TYPE {
LINEAR,
GRID,
STAGGERED_GRID
} /**
* layoutManager的类型(枚举)
*/
protected LAYOUT_MANAGER_TYPE layoutManagerType; /**
* 最后一个的位置
*/
private int[] lastPositions; /**
* 最后一个可见的item的位置
*/
private int lastVisibleItemPosition;
/* *//**
* 是否正在加载
*//*
private boolean isLoadingMore = false;*/ /**
* 当前滑动的状态
*/
private int currentScrollState = 0; @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy); RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
// int lastVisibleItemPosition = -1;
if (layoutManagerType == null) {
if (layoutManager instanceof LinearLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.LINEAR;
} else if (layoutManager instanceof GridLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.GRID;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
layoutManagerType = LAYOUT_MANAGER_TYPE.STAGGERED_GRID;
} else {
throw new RuntimeException(
"Unsupported LayoutManager used. Valid ones are LinearLayoutManager, GridLayoutManager and StaggeredGridLayoutManager");
}
} switch (layoutManagerType) {
case LINEAR:
lastVisibleItemPosition = ((LinearLayoutManager) layoutManager)
.findLastVisibleItemPosition();
break;
case GRID:
lastVisibleItemPosition = ((GridLayoutManager) layoutManager)
.findLastVisibleItemPosition();
break;
case STAGGERED_GRID:
StaggeredGridLayoutManager staggeredGridLayoutManager
= (StaggeredGridLayoutManager) layoutManager;
if (lastPositions == null) {
lastPositions = new int[staggeredGridLayoutManager.getSpanCount()];
}
staggeredGridLayoutManager.findLastVisibleItemPositions(lastPositions);
lastVisibleItemPosition = findMax(lastPositions);
break;
} } @Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
currentScrollState = newState;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
int visibleItemCount = layoutManager.getChildCount();
int totalItemCount = layoutManager.getItemCount();
if ((visibleItemCount > 0 && currentScrollState == RecyclerView.SCROLL_STATE_IDLE &&
(lastVisibleItemPosition) >= totalItemCount - 1)) {
//Log.d(TAG, "is loading more");
onBottom();
}
} @Override
public void onBottom() {
//Log.d(TAG, "is onBottom");
} private int findMax(int[] lastPositions) {
int max = lastPositions[0];
for (int value : lastPositions) {
if (value > max) {
max = value;
}
}
return max;
}
}
在之后的使用中,我们就可以像下方这样监听回调方法了:
waterFallRcv.setOnScrollListener(new OnRcvScrollListener(){
            @Override
            public void onBottom() {
                super.onBottom();
                // 到底部自动加载
                if (!isLoadingData){
                    Log.d(TAG, "loading old data");
                    adapter.loadOldData();
                    isLoadingData = true;
                }
            }
        });
通过重写OnScrollListener来监听RecyclerView是否滑动到底部的更多相关文章
- ScrollView滑动到底部或顶部监听,ScrollView滑动到底部或顶部再继续滑动监听;
		ScrollView滑动到底部或顶部后,再继续滑动达到一定距离的监听: ScrollView滑动到底部或顶部的监听: /** * 监听ScrollView滚动到顶部或者底部做相关事件拦截 */ pub ... 
- Android 通过OnScrollListener来监听RecyclerView的位置
		最近做一个漫画app,在阅读漫画界面需要通过获取recyclerView的位置来实时更新界面上的图片进度(比如1/9), 查阅资料得知了可以通过LayoutManager来获取recyclerView ... 
- 监听RecyclerView滑动到末端
		监听RecyclerView滑动到末端 效果图 实现 1. 添加滑动到末端的接口 package com.kongqw.recyclerviewdemo; /** * Created by kongq ... 
- Android商城开发系列(十四)——  设置监听RecyclerView的位置
		在前面的博客中有讲到过点击一个图片按钮控制RecyclerView的滚动到顶部位置的效果,但是那个图片按钮一直处在一个显示的状态,今天我们来改造一下那个地方,我们要实现的效果是:一开始打开的时候看不到 ... 
- Android 监听ScrollView的滑动
		我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 protected void onScrollChanged ... 
- Android Xlistview的源码浅度分析 监听ListView上下滑动 以及是否到顶和底部
		如转载 请注明出处 http://blog.csdn.net/sk719887916 比如我们很多项目中会用到listview 并且要对listview滑动方向进行判断 也有需要的到listview是 ... 
- Qt实现小功能之列表无限加载(创意很不错:监听滚动条事件,到底部的时候再new QListWidgetItem)
		概念介绍 无限加载与瀑布流的结合在Web前端开发中的效果非常新颖,对于网页内容具备较好的表现形式.无限加载并没有一次性将内容全部加载进来,而是通过监听滚动条事件来刷新内容的.当用户往下拖动滚动条或使用 ... 
- nestedScrollview 嵌套使用recyclerview判断滑动到底部 (嵌套滑动导致 不能使用recyclerview的onscrolled监听)
		NestedScrollView scroller = (NestedScrollView) findViewById(R.id.myScroll); if (scroller != null) { ... 
- js监听网页页面滑动滚动事件,实现导航栏自动显示或隐藏
		/** * 页面滑动滚动事件 * @param e *///0为隐藏,1为显示var s = 1;function scrollFunc(e) { // e存在就用e不存在就用windon.event ... 
随机推荐
- javacc学习
			为什么要研究这些,除了个人兴趣之外,还有可以了解语言是怎样解析字符串生成逻辑代码. 他的应用性也是非常之广,如人工智能方面,把复杂的逻辑抽象成简单的文法,不懂编程的人都可以使用 说到人工智能,数据库S ... 
- Windows Azure Compute Emulator无法启动问题解决方案
			Visual Studio 2013安装了Windows Azure SDK 2.7,但启动Emulator调试时,出现如下错误: Error: The installed Windows Azure ... 
- C# 128位AES 加密解密  (转)
			/// AES加密 2 /// </summary> 3 /// <param name="inputdata">输入的数据 ... 
- Web services 安全 - HTTP Basic Authentication
			根据 RFC2617 的规定,HTTP 有两种标准的认证方式,即,BASIC 和 DIGEST.HTTP Basic Authentication 是指客户端必须使用用户名和密码在一个指定的域 (Re ... 
- ruby -- 基础学习(七)时间的内置函数和格式说明
			Rails -- 时间的内置函数和格式说明 FROM:http://www.douban.com/note/99064603/ time = Time.now #获得当前时间 time.gmt ... 
- Android 布局之GridLayout
			Android 布局之GridLayout 1 GridLayout简介 GridLayout是Android4.0新提供的网格矩阵形式的布局控件. GridLayout的继承关系如下:java.la ... 
- [Math] Hidden Markov Model
			链接:https://www.zhihu.com/question/20962240/answer/33438846 霍金曾经说过,你多写一个公式,就会少一半的读者. 还是用最经典的例子,掷骰子. ... 
- 【转载】Linux动态库搜索路径的技巧
			转自:http://soft.chinabyte.com/os/232/11488732_2.shtml 众所周知,Linux动 态库的默认搜索路径是/lib和/usr/lib.动态库被创建后,一般都 ... 
- Jellycons – iOS 8 图标下载(PNG, SKETCH)
			Jellycons 这套由 LoveUI.co 设计图标包括30款扁平化,圆滑,丰富多彩的 iOS 8 应用程序图标,可以用于于个人和商业项目的使用.另外,PNG 格式包含11种尺寸(1024px, ... 
- str()和repre()的区别
			应用中的区别: %s 就是调用str()——用于显示字符串 %r 就是调用repr()——用于调试时显示 str()一般是将数值转成字符串. repr()是将一个对象转成字符串显示,注意只是显示用,有 ... 
