我们知道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. 微信H5中的一些坑

    最近在写微信公众号H5页面 遇到了一些坑,在这里记录一下 记录一下signature的计算 // 首先找到hex_sha1的加密算法,ticket 是后端提供的 var url_local = loc ...

  2. [LeetCode] Same Tree 判断相同树

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  3. 好用的wget命令从下载添加环境变量到各参数详解

    本文是因为(笔者使用的windows系统)使用过好几次wget后,始终存在各种细节问题,于是下定决定细致的研究一下,并记录下其中细节. 下载与安装 第一步:下载wget,网络地址:http://dow ...

  4. XPatchLib 对象增量数据序列化及反序列化器 For .Net

    在日常的软件开发和使用过程中,我们发现同一套系统的同一配置项在不同的客户环境中是存在各种各样的差异的.在差异较为分散时,如何较好的管理这些差异,使得维护过程能够更加安全和快速,一直在这样那样的困扰着开 ...

  5. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  6. map

    说明 map()是python的内置函数. 定义:接收2个参数,第一个参数一般为方法:第二个参数为可迭代对象,此方法会自动迭代第二个参数,然后将获取的数据传入第一个参数. 案例操作 需求:将下面的数据 ...

  7. 使用hexo,如果换了电脑怎么更新博客?

    自己今天想到这个问题,于是去知乎搜索了一番,发现不甚理想.没找到合适的,题目就是知乎原题.只好自己解决了.以下直接把自己的答案粘贴过来 今天我突然想到这个问题,想来参考参考,却发现都不太适合我.首先, ...

  8. js设置css样式.

    在js设置css样式做法 var obj = document.getElementById('div'); obj.style.width = '100px'; obj.style.height = ...

  9. Selenium+python 配置

    1. 安装python, www.python.org. 下载最新的python,应该是32位的.注意配置环境变量. 2. 安装PIP(pip是一个以Python计算机程序语言写成的软件包管理系统). ...

  10. C语言产生标准正态分布或高斯分布随机数

    C语言 产生标准正态分布或高斯分布 随机数 产生正态分布或高斯分布的三种方法: 1. 运用中心极限定理(大数定理) #include #include #define NSUM 25 double g ...