我们知道xUtils中的bitmapUtils与listview相配合可以实现滚动时暂停加载

只需要一句话:

listview.addOnScrollListener(new PauseOnScrollListener(
bitmapUtils, false, true));

然而在我所使用的xUtils2.6版本上,如果想对recyclerView使用相似的方法是行不通的

(ps:因为xUtils3只支持api14,所以我没用xUtils3)

recyclerView.addOnScrollListener(new PauseOnScrollListener(
bitmapUtils, false, true));

因为参数需要的是RecyclerView.OnScrollListener,

而xUtils只提供了实现AbsListView.OnScrollListener的listener

这个时候只能自己动手改动xUtils源码了

进入到PauseOnScrollListener的源码中

import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.task.TaskHandler; public class PauseOnScrollListener implements OnScrollListener { private TaskHandler taskHandler; private final boolean pauseOnScroll;
private final boolean pauseOnFling;
private final OnScrollListener externalListener; /**
* Constructor
*
* @param taskHandler {@linkplain BitmapUtils} instance for controlling
* @param pauseOnScroll Whether {@linkplain BitmapUtils#pause() pause loading} during touch scrolling
* @param pauseOnFling Whether {@linkplain BitmapUtils#pause() pause loading} during fling
*/
public PauseOnScrollListener(TaskHandler taskHandler, boolean pauseOnScroll, boolean pauseOnFling) {
this(taskHandler, pauseOnScroll, pauseOnFling, null);
} /**
* Constructor
*
* @param taskHandler {@linkplain BitmapUtils} instance for controlling
* @param pauseOnScroll Whether {@linkplain BitmapUtils#pause() pause loading} during touch scrolling
* @param pauseOnFling Whether {@linkplain BitmapUtils#pause() pause loading} during fling
* @param customListener Your custom {@link android.widget.AbsListView.OnScrollListener} for {@linkplain android.widget.AbsListView list view} which also will
* be get scroll events
*/
public PauseOnScrollListener(TaskHandler taskHandler, boolean pauseOnScroll, boolean pauseOnFling, OnScrollListener customListener) {
this.taskHandler = taskHandler;
this.pauseOnScroll = pauseOnScroll;
this.pauseOnFling = pauseOnFling;
externalListener = customListener;
} @Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
taskHandler.resume();
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
if (pauseOnScroll) {
taskHandler.pause();
}
break;
case OnScrollListener.SCROLL_STATE_FLING:
if (pauseOnFling) {
taskHandler.pause();
}
break;
}
if (externalListener != null) {
externalListener.onScrollStateChanged(view, scrollState);
}
} @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (externalListener != null) {
externalListener.onScroll(view, firstVisibleItem, visibleItemCount, totalItemCount);
}
}
}

意外地发现不是很长,其中主要起作用的除了两个重写的方法外,就是TaskHandler这个接口了

BitmapUtils其实是继承了TaskHandler

TaskHandler对handler进行了进一步的封装,方便控制异步任务

TaskHandler具有pause()和resume()两个很重要的方法,由BitmapUtils等实现

@Override
public void pause() {
pauseTask = true;
flushCache();
} @Override
public void resume() {
pauseTask = false;
synchronized (pauseTaskLock) {
pauseTaskLock.notifyAll();
}
}

看到这里思路就比较明显了,我们继承RecyclerView.OnScrollListener并重写其中的回调方法

在回调方法中调用TaskHandler的api,即可达到想要的效果.

精简后的代码如下

import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.task.TaskHandler; import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.OnScrollListener; ; public class PauseOnScrollListener extends RecyclerView.OnScrollListener {
private TaskHandler taskHandler; private boolean pauseOnScroll;
private boolean pauseOnFling;
private OnScrollListener externalListener; /**
* Constructor
*
* @param taskHandler
* {@linkplain BitmapUtils} instance for controlling
* @param pauseOnScroll
* Whether {@linkplain BitmapUtils#pause() pause loading} during
* touch scrolling
* @param pauseOnFling
* Whether {@linkplain BitmapUtils#pause() pause loading} during
* fling
*/
public PauseOnScrollListener(TaskHandler taskHandler,
boolean pauseOnScroll, boolean pauseOnFling) {
this(taskHandler, pauseOnScroll, pauseOnFling, null);
} /**
* Constructor
*
* @param taskHandler
* {@linkplain BitmapUtils} instance for controlling
* @param pauseOnScroll
* Whether {@linkplain BitmapUtils#pause() pause loading} during
* touch scrolling
* @param pauseOnFling
* Whether {@linkplain BitmapUtils#pause() pause loading} during
* fling
* @param customListener
* Your custom
* {@link android.widget.AbsListView.OnScrollListener} for
* {@linkplain android.widget.AbsListView list view} which also
* will be get scroll events
*/
public MyPauseOnScrollListener(TaskHandler taskHandler,
boolean pauseOnScroll, boolean pauseOnFling,
OnScrollListener customListener) {
this.taskHandler = taskHandler;
this.pauseOnScroll = pauseOnScroll;
this.pauseOnFling = pauseOnFling;
externalListener = customListener;
} @Override
public void onScrollStateChanged(RecyclerView view, int newState) {
switch (newState) { case 0:
taskHandler.resume();
break; case 1:
if (pauseOnScroll) {
taskHandler.pause();
}
break; case 2:
if (pauseOnFling) {
taskHandler.pause();
}
break;
}
if (externalListener != null) {
externalListener.onScrollStateChanged(view, scrollState);
}
} @Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (externalListener != null) {
externalListener.onScrolled(recyclerView, dx, dy);
}
} }

本文结束.

(原创)RecyclerView结合xUtils2.6实现滚动时不加载item,xUtils2.6的源码分析与改造的更多相关文章

  1. RecyclerView的通用适配器,和滚动时不加载图片的封装

    对于RecyclerView我们需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,具体代码大家可以在网上搜索,这里就只教大家使用封装后的简洁RecyclerAdap ...

  2. EasyUI 1.4.4 DataGrid(大数据量) bufferview滚动时不加载下一页数据解决方案

    在使用Easyui DataGrid 过程中,发现若单页数据量超过300,IE浏览器加载速度很慢.也通过网上找寻了很多解决方案,最典型的就是去掉datagrid的自动列宽以及自动行高判断. 1.解决自 ...

  3. [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. bootstrap源码分析之scrollspy(滚动侦听)

    源码文件: Scrollspy.js 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2.导航必须是 .nav > li > a 结构,并且a ...

  5. Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据

    使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...

  6. RecyclerView 源码分析(一) —— 绘制流程解析

    概述 对于 RecyclerView 是那么熟悉又那么陌生.熟悉是因为作为一名 Android 开发者,RecyclerView 是经常会在项目里面用到的,陌生是因为只是知道怎么用,但是却不知道 Re ...

  7. RecyclerView 源码分析(二) —— 缓存机制

    在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...

  8. STL源码分析《3》----辅助空间不足时,如何进行归并排序

    两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在  ...

  9. ElasticSearch 启动时加载 Analyzer 源码分析

    ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档 ...

随机推荐

  1. [LeetCode] Arithmetic Slices 算数切片

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  2. 百度广告 高亮 Chrome插件(附源码)

    一前言 百度最近是上了舆论头条了,相信中过百度毒的人对百度都反感.百度自己挖了这么多坑,终究还是要自己来填.国内网民使且最频繁的搜过 还是以百度为主,而百度依靠这种市场占有率靠他的广告竞价排名大发横财 ...

  3. .NET跨平台之旅:corehost 是如何加载 coreclr 的

    在前一篇博文中,在好奇心的驱使下,探秘了 dotnet run ,发现了神秘的 corehost  —— 运行 .NET Core 应用程序的幕后英雄.有时神秘就是一种诱惑,神秘的 corehost ...

  4. .net(C#)中this关键字

    使用this关键字引用成员变量使用this关键字在自身构造方法内部引用其它构造方法使用this关键字代表自身类的对象使用this关键字引用成员方法 在一个类的方法或构造方法内部,可以使用"t ...

  5. autofs自动挂载

    autofs是根据需要自动挂载,默认5分钟不使用自动卸载挂载点!nfs,smb,iso,sd*的挂载 环境:RHEL6.5/Centos6.5    172.24.0.25 01.安装autofs y ...

  6. 20170103简单解析MySQL查询优化器工作原理

    转自博客http://www.cnblogs.com/hellohell/p/5718238.html 感谢楼主的贡献 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL ...

  7. ES6深入学习记录(三)编程风格

    今天学习阮一峰ES6编程风格,其中探讨了如何将ES6的新语法,运用到编码实践之中,与传统的JavaScript语法结合在一起,写出合理的.易于阅读和维护的代码. 1.块级作用域 (1)let 取代 v ...

  8. JS使用getComputedStyle()方法获取CSS属性值

    在对网页进行调试的过程中,经常会用到js来获取元素的CSS样式,方法有很多很多,现在仅把我经常用的方法总结如下: 1. obj.style:这个方法只能JS只能获取写在html标签中的写在style属 ...

  9. 小猪cms命名规则整理

    1.模板命名规则: 类名+函数名称+.html 2.Model命名规则: 数据库表名:cms_user_data 文件名称命名: UserDataModel.class.php <?php cl ...

  10. Javascript作用域研究(with)

    基本用法参考:http://www.cnblogs.com/silentjesse/p/4024536.html 这里说明以下with的用法: with语句 with语句主要用来临时扩展作用域链,将语 ...