(原创)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官方文档 ...
随机推荐
- [EF1]POCOs(Plain Old C# Object)Entity Framework 4.x: POCOs入门
原文链接:http://www.cnblogs.com/hjzhang/archive/2011/05/18/2050530.html POCOs 是在Visual Studio 2010和ASP.N ...
- java日志学习笔记
一.日志家族 Log4j一开始就很强大,在jdk自带日志系统之前,apache就曾经尝试把log4j划为java的一部分,不知为何没能成功,sun还是用了自己很弱的日志系统.为了兼容各个日志系统,ap ...
- 腾讯 auth_token
auth_token 从cookies里取出supertoken=2881515311; function auth_token(str) { var hash = 0; for (var i = 0 ...
- [转]CSS如何设置html table表格边框样式
原文地址:http://www.divcss5.com/wenji/w503.shtml 对table设置css样式边框,分为几种情况: 1.只对table设置边框 2.对td设置边框 3.对tabl ...
- Django进阶(一)
Url进阶 mysit/mysit/urls.py from django.conf.urls import url from django.contrib import admin urlpatte ...
- java 中正则表达式匹配
String str = "#a#,#b#"; String reg="\\#+[^\\#]+\\#+"; Pattern p=Pattern.compile( ...
- java--面向对象---访问属性
<第一节> private--只能用于成员变量和成员函数(限制于类而不是对象),即只能在本类中访问被定义为private 的变量 public-- protected-- <第二节& ...
- HTML 全局属性
http://www.w3school.com.cn/tags/html_ref_standardattributes.asp
- js比较版本号
比较版本v2.2.3和2.1.15大小 //假定字符串的每节数都在5位以下 function toNum(a){ var a=a.toString(); //也可以这样写 var c=a.split( ...
- 【原创】自己动手写工具----XSmartNote [Beta 1.0]
一.背景 有个朋友是在他们单位的市场部,手里的策划文案以及PPT,少则数百,多则上千,多年下来也是一笔不可小觑的财富,每一次新的策划都可以从以往的文案或PPT中“拿来主义”,有着很好的借鉴意义,但是这 ...