文档章节

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

爱看博客
 爱看博客
发布于 2015/10/22 10:06
字数 1064
阅读 46
收藏 0
点赞 0
评论 0

很早之前写过一篇讲ListView的万能适配器的方案通用Adapter与ListView滚动时不加载图片的封装,可以让你在写ListView的Adapter时只关注对控件设置内容,而不需要再去考虑ViewHolder、控件初始化、以及实现BaseAdapter的其他三个必须实现的函数。
对于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点击事件了。

一点补充

有关滚动时不加载图片,之前有人提起了说我没有提到,这里就顺带讲一下实现原理:
其实就是在我们我适配器中声明一个全局的boolean变量用来保存此刻是否在滚动,然后通过给ListView或RecyclerView设置滚动监听,然后在滚动监听器的onScrollStateChanged()方法中给boolean值赋值,看是否在滚动。
这样在我们使用这个适配器的时候,就可以根据滚动状态的不同来判断:比如正在滚动的时候就只显示内存缓存的图片,如果内存缓存中没有就显示一张默认图片;而如果没有在滚动就采用正常的图片加载方案去加载网络或者缓存中的图片。

版权声明:本文原创,转载请注明来自 http://kymjs.com/

本文转载自:http://blog.csdn.net/kymjs/article/details/49068675

共有 人打赏支持
爱看博客
粉丝 5
博文 103
码字总数 23887
作品 0
深圳
RecyclerView的通用适配器,和滚动时不加载图片的封装

很早之前写过一篇讲ListView的万能适配器的方案通用Adapter与ListView滚动时不加载图片的封装,可以让你在写ListView的Adapter时只关注对控件设置内容,而不需要再去考虑ViewHolder、控件初始...

kymjs张涛 ⋅ 2015/10/11 ⋅ 2

APP实现与原理

实现 不需要任何权限获得Android设备的唯一ID RecyclerView的通用适配器,和滚动时不加载图片的封装 完美的解决如何让AsyncTask终止操作 webview rexsee sdcard 缓存文件可以放在哪里?它们各...

addcn ⋅ 2015/12/16 ⋅ 0

【Android】RecyclerView下拉刷新与加载更多

知道自己不能做什么远比知道自己能做什么重要。 RecyclerView是Android L版本中新添加的控件,它的灵活性、可替代性、回收机制等比listview更好。可能对于一些使用过RecyclerView的开发者会说...

zrunker ⋅ 2017/10/26 ⋅ 0

Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果。当然,在新能方便也做了大大的提高。本篇 第四十六话...

qq_32059827 ⋅ 2016/12/07 ⋅ 0

XamarinAndroid组件教程RecylerView适配器设置动画示例

XamarinAndroid组件教程RecylerView适配器设置动画示例 【示例1-3】下面将在RecylerView的子元素进行滚动时,使用适配器动画。具体的操作步骤如下: (1)创建一个名为RecylerViewAnimatorsA...

大学霸 ⋅ 06/13 ⋅ 0

RecyclerView多功能集合适配器:SuperAdapter

引言 从上学到工作,一晃搞Android也已经有几年了,用的最多控件不外乎就那么几个,其中列表控件用起来相对来说比较繁琐,尤其是出了之后。前段时间突发奇想做一个通用的适配器这样就不用每次...

吴七禁 ⋅ 2017/10/11 ⋅ 0

手机商城第五天,用recyclerview设置秒杀区域的布局,以及为该recyclerview设置item级的点击事件

代码已经托管到码云上,有兴趣的小伙伴可以下载看看: https://git.oschina.net/joy_yuan/ShoppingMall 之前可能忘记了web端,也就是这个APP里面内容的来源。其实就是一个简单的Tomcat里的小...

老婆的宝宝 ⋅ 2017/08/28 ⋅ 0

一个适用于ListView/GridView/RecyclerView的通用适配器

简化大量重复代码 支持多布局 自定义图片加载 常用数据操作 view复用 RecyclerView item 点击和长按事件 GitHub源码地址 简书地址 gradle依赖 开始使用 ListView/GridView 使用示例 Recycler...

a125138 ⋅ 2016/03/09 ⋅ 0

那些年不容错过的智能下拉刷新加载框架

一些值得学习的几个下拉刷新上拉加载开源库 功能齐全的AnimRefreshRecyclerView 根据列表的不同效果选择不同的布局管理器 根据不同的布局管理器设置分割线: 设置Header和Footer 手动刷新 An...

codeGoogle ⋅ 2017/09/26 ⋅ 0

Android进阶——框架打造之RecyclerView框架

前言 RecyclerView已经完全替代了ListView的开发,其强大之处在于性能、内存、使用、灵活、丰富的API、动画、事件处理上都可以完美的体现出来,对于开发者来说RecyclerView是必须精通的一关,...

qq_30379689 ⋅ 01/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 53分钟前 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部