RecyclerView的通用适配器,和滚动时不加载图片的封装
对于RecyclerView我们需要使用RecyclerAdapter,使用方式与ListViewAdapter类似,具体代码大家可以在网上搜索,这里就只教大家使用封装后的简洁RecyclerAdapter了。
核心代码
首先我们来看一部分核心代码:
public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<RecyclerHolder> {
public BaseRecyclerAdapter(RecyclerView v, Collection<T> datas, int itemLayoutId) {
//...
}
/**
* Recycler适配器填充方法
*
* @param holder viewholder
* @param item javabean
* @param isScrolling RecyclerView是否正在滚动
*/
public abstract void convert(RecyclerHolder holder, T item, int position, boolean isScrolling);
@Override
public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(cxt);
View root = inflater.inflate(mItemLayoutId, parent, false);
return new RecyclerHolder(root);
}
@Override
public void onBindViewHolder(RecyclerHolder holder, int position) {
convert(holder, realDatas.get(position), position, isScrolling);
holder.itemView.setOnClickListener(getOnClickListener(position));
}
}
以及RecyclerHolder的代码
public class RecyclerHolder extends RecyclerView.ViewHolder {
private final SparseArray<View> mViews;
public RecyclerHolder(View itemView) {
super(itemView);
//一般不会超过8个吧
this.mViews = new SparseArray<View>(8);
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
*/
public <T extends View> T getView(int viewId) {
View view = mViews.get(viewId);
if (view == null) {
view = itemView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
/**
* 为TextView设置字符串
*/
public RecyclerHolder setText(int viewId, String text) {
TextView view = getView(viewId);
view.setText(text);
return this;
}
/**
* 为ImageView设置图片
*/
public RecyclerHolder setImageByUrl(KJBitmap bitmap, int viewId, String url) {
bitmap.display(getView(viewId), url);
return this;
}
}
实现原理
其实实现原理和我们之前讲过的ListView通用适配器的实现原理是一致的。Google以及在RecyclerAdapter中规范了Holder的应用,加入了onCreateViewHolder()和onBindViewHolder()方法分别来实现ViewHolder的创建和对Holder中的控件设置内容。
但是适配器写多了以后我们就会发现,其实这两个函数中写的内容也是重复的,于是就有了RecyclerHolder这个我们自己封装的Holder。
与平时我们自己实现的ViewHolder最大的不同在于,我们以前定义ViewHolder都是一个item里面要用哪个控件就定义哪个控件,而为了通用,我们抽出它们共同的部分————都是View。
但是我们还不知道我们的item中究竟会有多少个控件,所以这里我们再定义一个集合类,当然它也可以是一个Map(不能是List,因为我们还需要读取这个View呢,如果是List,就不知道哪个View保存在List的哪个index了,而用map可以通过View的id来作为key读取),这里我们依旧使用推荐的SparseArray,原因我们之前的通用ListView适配器中已经讲过了,这里就不再多说了,只需要把它看成是一个性能更好的Map就行了。
完整代码
最后,还有一个细节大家可以在完整代码中看到,就是我加入了滚动监听与item点击事件,这样就可以很方便的在基类中实现RecyclerView滚动的时候不加载图片,以及Google没有提供的RecyclerView的item点击事件了。
- 附上完整代码的GitHub路径:
完整的BaseRecyclerAdapter
完整的RecyclerHolder
以及实际使用Demo
一点补充
有关滚动时不加载图片,之前有人提起了说我没有提到,这里就顺带讲一下实现原理:
其实就是在我们我适配器中声明一个全局的boolean变量用来保存此刻是否在滚动,然后通过给ListView或RecyclerView设置滚动监听,然后在滚动监听器的onScrollStateChanged()方法中给boolean值赋值,看是否在滚动。
这样在我们使用这个适配器的时候,就可以根据滚动状态的不同来判断:比如正在滚动的时候就只显示内存缓存的图片,如果内存缓存中没有就显示一张默认图片;而如果没有在滚动就采用正常的图片加载方案去加载网络或者缓存中的图片。
RecyclerView的通用适配器,和滚动时不加载图片的封装的更多相关文章
- (原创)RecyclerView结合xUtils2.6实现滚动时不加载item,xUtils2.6的源码分析与改造
我们知道xUtils中的bitmapUtils与listview相配合可以实现滚动时暂停加载 只需要一句话: listview.addOnScrollListener(new PauseOnScrol ...
- EasyUI 1.4.4 DataGrid(大数据量) bufferview滚动时不加载下一页数据解决方案
在使用Easyui DataGrid 过程中,发现若单页数据量超过300,IE浏览器加载速度很慢.也通过网上找寻了很多解决方案,最典型的就是去掉datagrid的自动列宽以及自动行高判断. 1.解决自 ...
- 实现selenium+Chrome爬取时不加载图片——配置
# -*- coding:utf-8 -*- from selenium import webdriver ''' 设置页面不加载图片,这样可以加快页面的渲染,减少爬虫的等待时间,提升爬取效率 固定配 ...
- RecyclerView的通用适配器
本来这一个主题应该早就写了,只是项目多,属于自己的时间不多,所以现在才开动!! 前一段时间写了一篇文章,是关于ListView,GriView万能适配器,没有看过的同学,可以先看看那篇文章,然后在来学 ...
- Android开源代码解读のOnScrollListener实现ListView滚屏时不加载数据
使用ListView过程中,如果滚动加载数据的操作比较费时,很容易在滚屏时出现屏幕卡住的现象,一个解决的办法就是不要在滚动时加载数据,而是等到滚动停止后再进行数据的加载.这同样要实现OnScrollL ...
- 向下滚动页面加载图片的js
js代码 scroll.photo.js : window.imgscroll = { options: { target: null, //插入图片的目标位置 img_list: null, //图 ...
- 让selenium中的Cromerderive不加载图片设置
把配置参数(chrom_opt)设置好后将其添加到 browser = webdriver.Chrome(executable_path="chromedriver.exe的路径" ...
- Android RecyclerView使用 及 滑动时加载图片优化方案
1.控制线程数量 + 数据分页加载2.重写onScrollStateChanged方法 这个我们后面再谈,下面先来看看RecyclerView控件的使用及我们为什么选择使用它 RecyclerView ...
- Swift - 表格图片加载优化(拖动表格时不加载,停止时只加载当前页图片)
列表的单元格中包含有图片在开发中很常见.通常我们可以直接在tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIn ...
随机推荐
- VisualVM使用Jstatd和JMX远程监控配置(转载)
一.Jstatd远程监控服务器配置 jstat可以实时显示本地或远程JVM进程中类装载.内存.垃圾收集.JIT编译等数据.如果要显示远程JVM信息,需要远程主机开启RMI支持,详情如下: 1. 在JA ...
- JAVA-JSP Scriptlets(JSP小脚本)
相关资料: <21天学通Java Web开发> 结果总结: 1.<% %>可以包含多个语句,如:方法.变量.表达式.2.类型定义时,如:int.String必须注意大小写. 实 ...
- 【C#/WPF】Button按钮动态设置Background背景颜色
学习笔记: 在XAML中给Button设置颜色大家都懂的,本篇只是记录用C#代码动态生成的按钮设置Background背景颜色. new一个Button,设置Background时可看到该属性类型是S ...
- 利用MapReduce实现倒排索引
这里来学习的是利用MapReduce的分布式编程模型来实现简单的倒排索引. 首先什么是倒排索引? 倒排索引是文档检索中最常用的数据结构,被广泛地应用于全文搜索引擎. 它主要是用来存储某个单词(或词组) ...
- linux gpio控制之sysfs接口
在3.14及之后的linux中对gpio提供了sysfs接口,说明文档:Documents/gpio/sysfs.txt. Platforms which use the "gpiolib& ...
- c#生成rsa公钥和私钥
c#生成rsa公钥和私钥的类库,包括加密解密,可以用在网站和winform项目 源码地址: http://download.csdn.net/detail/jine515073/8383809
- 记录日志框架:log4net使用
一.log4net简介 Log4net是Apache下一个开放源码的项目,我们可以控制日志信息的输出目的地.Log4net中定义了多种日志信息输出模式.在做项目的时候最头疼的是在程序发布到正式环境之后 ...
- 搭建Grunt集成环境开发SASS
先行下载安装Ruby和SASS 再下载并安装node.js,已经集成了NPM 命令行查看是否安装成功 node -v npm -v 命令行安装grunt npm install -g grunt-cl ...
- JAVA虚拟机、Dalvik虚拟机和ART虚拟机简要对比
1.什么是JVM? JVM本质上就是一个软件,是计算机硬件的一层软件抽象,在这之上才能够运行Java程序,JAVA在编译后会生成类似于汇编语言的JVM字节码,与C语言编译后产生的汇编语言不同的是, ...
- nginx反向代理压测问题记录
使用nginx反向代理压测web程序,100个用户并发时,每隔一段时间loadrunner工具中就会报错,报错信息如下: Continuing after Error -26610: HTTP Sta ...