(原创)RecyclerView结合xUtils2.6实现滚动时不加载item,xUtils2.6的源码分析与改造
我们知道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的源码分析与改造的更多相关文章
- RecyclerView的通用适配器,和滚动时不加载图片的封装
对于RecyclerView我们需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,具体代码大家可以在网上搜索,这里就只教大家使用封装后的简洁RecyclerAdap ...
- EasyUI 1.4.4 DataGrid(大数据量) bufferview滚动时不加载下一页数据解决方案
在使用Easyui DataGrid 过程中,发现若单页数据量超过300,IE浏览器加载速度很慢.也通过网上找寻了很多解决方案,最典型的就是去掉datagrid的自动列宽以及自动行高判断. 1.解决自 ...
- [原创]java WEB学习笔记70:Struts2 学习之路-- struts2拦截器源码分析,运行流程
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- bootstrap源码分析之scrollspy(滚动侦听)
源码文件: Scrollspy.js 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项2.导航必须是 .nav > li > a 结构,并且a ...
- Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据
使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...
- RecyclerView 源码分析(一) —— 绘制流程解析
概述 对于 RecyclerView 是那么熟悉又那么陌生.熟悉是因为作为一名 Android 开发者,RecyclerView 是经常会在项目里面用到的,陌生是因为只是知道怎么用,但是却不知道 Re ...
- RecyclerView 源码分析(二) —— 缓存机制
在前一篇文章 RecyclerView 源码分析(一) -- 绘制流程解析 介绍了 RecyclerView 的绘制流程,RecyclerView 通过将绘制流程从 View 中抽取出来,放到 Lay ...
- STL源码分析《3》----辅助空间不足时,如何进行归并排序
两个连在一起的序列 [first, middle) 和 [middle, last) 都已经排序, 归并排序最核心的算法就是 将 [first, middle) 和 [middle, last) 在 ...
- ElasticSearch 启动时加载 Analyzer 源码分析
ElasticSearch 启动时加载 Analyzer 源码分析 本文介绍 ElasticSearch启动时如何创建.加载Analyzer,主要的参考资料是Lucene中关于Analyzer官方文档 ...
随机推荐
- jQuery 常用速查
jQuery 速查 基础 $("css 选择器") 选择元素,创建jquery对象 $("html字符串") 创建jquery对象 $(callback) $( ...
- 打包SpringBoot工程并部署
使用工具:Eclipse Linux下JDK版本:jdk-7u79-linux-x64.tar.gz 一.打包成jar并部署 步骤如下: 首先上pom.xml: <project xmlns=& ...
- java.io.IOException: mark/reset not supported
java.io.IOException: mark/reset not supported at java.io.InputStream.reset(InputStream.java:348) at ...
- Tower是个不错的项目管理开放平台
简单,易用,轻量级,挺多大项目都在用. 目前公司的项目也在使用,但是从高层到底下,随意惯了,最终没有用起来. 感觉适合年轻激情的创业公司团队来使用. 附上地址:https://tower.im/
- C++ 数组array与vector的比较
转:http://blog.csdn.net/yukin_xue/article/details/7391897 1. array 定义的时候必须定义数组的元素个数;而vector 不需要: 且只能包 ...
- 【日常操作记录】Asp.Net Core 的一些基本操作或属性
用于记录在项目中使用到的方法.属性.操作,持续更新中 静态文件的使用 在项目中静态文件的使用需要在Startup中的Configure方法中增加: //使用静态文件 app.UseStaticFile ...
- css 的一些基本操作
日常基本使用的一些操作,持续完善中: 设置按钮圆角:border-radius:5px; 设置高度:height: 30px; 设置宽度:width: 64px; 使用span标签内容过长自动换行解决 ...
- caffe添加自己的层
首先修改src/caffe/proto/下的caffe.proto,修改好后需要编译 然后修改include/caffe/layers/logwxl_layer.hpp 然后修改src/caffe/l ...
- jquery.on()超级方法
$.on()方法是jquery1.7之后的一个超级方法,将事件绑定和事件委托整合到一个函数中去,支持绑定多个事件,并且可以绑定自定义事件.使用起来很方便. demo传送门 事件委托 首先说一下事件委托 ...
- IDEA快捷键
[常规] Ctrl+Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更 ...