RecyclerView中的设计模式解读

一.观察者模式:(待完善,这个写的不咋地,没理解透彻)

1.观察者模式的概念:

(1)消息传递方向:被观察者->观察者

(2)代码实现:

首先具有一个接口,该接口是所有观察者的父接口,各个子观察者通过实现这个接口来实例化一个观察者对象,而被观察者会持有观察者对象的引用。至于怎么将观察者对象传给这个引用的方法有很多,比如通过在被观察者对象类里面写set方法让观察者对象来调用、利用构造函数的参数传递等等。

(3)快速记忆:

被观察者:持有引用;在什么时候去做这件事情;

观察者:实现接口;具体做什么事情;

2.RecyclerView中的观察者模式:

(1)简介:RecyclerView中的Adapter的整体实现就是一个观察者模式

(2)源码分析:(以notifyDataSetChanged()为例)

<1>RecyclerView中的Adapter,是一个内部静态类:

public abstract static class Adapter<VH extends RecyclerView.ViewHolder> {//被观察者private final RecyclerView.AdapterDataObservable mObservable = new RecyclerView.AdapterDataObservable();//注册观察者public void registerAdapterDataObserver(@NonNull RecyclerView.AdapterDataObserver observer) {this.mObservable.registerObserver(observer);}//注销观察者public void unregisterAdapterDataObserver(@NonNull RecyclerView.AdapterDataObserver observer) {this.mObservable.unregisterObserver(observer);}//调用被观察者的方法public final void notifyDataSetChanged() {this.mObservable.notifyChanged();}}

<2>AdapterDataObservable ,被观察者对象类:

 static class AdapterDataObservable extends Observable<RecyclerView.AdapterDataObserver> {public void notifyChanged() {for(int i = this.mObservers.size() - 1; i >= 0; --i) {//遍历所有的子观察者,调用子观察者的onChanged()方法((RecyclerView.AdapterDataObserver)this.mObservers.get(i)).onChanged();}}}

<3>AdapterDataObserver 类,调用onChanged()方法,这是抽象类:

 public abstract static class AdapterDataObserver {public void onChanged() {}}

<4>RecyclerViewDataObserver 类,为AdapterDataObserver类的实现类,真正调用onChanged()方法的地方:

 private class RecyclerViewDataObserver extends RecyclerView.AdapterDataObserver {public void onChanged() {RecyclerView.this.assertNotInLayoutOrScroll((String)null);RecyclerView.this.mState.mStructureChanged = true;RecyclerView.this.processDataSetCompletelyChanged(true);if (!RecyclerView.this.mAdapterHelper.hasPendingUpdates()) {//重新绘制界面RecyclerView.this.requestLayout();}}}

<5>setAdapter()方法,调用此方法来设置adapter:

 public void setAdapter(@Nullable RecyclerView.Adapter adapter) {this.setLayoutFrozen(false);this.setAdapterInternal(adapter, false, true);this.processDataSetCompletelyChanged(false);this.requestLayout();}

<6>setAdapterInternal()方法

 private void setAdapterInternal(@Nullable RecyclerView.Adapter adapter, boolean compatibleWithPrevious, boolean removeAndRecycleViews) {if (this.mAdapter != null) {//注销观察者this.mAdapter.unregisterAdapterDataObserver(this.mObserver);this.mAdapter.onDetachedFromRecyclerView(this);}if (adapter != null) {//注册观察者adapter.registerAdapterDataObserver(this.mObserver);adapter.onAttachedToRecyclerView(this);}}

(3)总结:

Recyclerview中的Adapter可以理解为观察者的父类,我们可以自己实现一个继承自Recyclerview中的Adapter的子类,也就是实例化一个观察者对象。然后通过Recyclerview中的setAdapter()方法可以将这个对象设置给被观察者。例如此时在这个对象中调用notifyDataSetChanged()方法,那么最终会调用被观察者的notifyChanged()方法。

二.其他(待更新)

RecyclerView 中的设计模式 | Agehua

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/227502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

105基于matlab的阶次分析算法

基于matlab的阶次分析算法&#xff0c;用于变转速机械故障特征提取&#xff0c;可运行&#xff0c;包含寻找脉冲时刻&#xff0c;等角度时刻。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 105阶次分析变转速信号处理 (xiaohongshu.com)

【华为数据之道学习笔记】5-5结构化数据入湖

结构化数据是指由二维表结构来逻辑表达和实现的数据&#xff0c;严格遵循数据格式与长度规范&#xff0c;主要通过关系型数据库进行存储和管理。 触发结构化数据入湖的场景有两种&#xff1a;第一&#xff0c;企业数据管理组织基于业务需求主动规划和统筹&#xff1b;第二&…

2.1 【渲染】渲染介绍

一&#xff0c;渲染是什么&#xff1f; 渲染是指生成图像。 二&#xff0c;渲染的类型 屏幕应用程序可以以多种不同的方式呈现&#xff1a; 2.1 Software 软件 应用程序使用CPU访问缓冲区并向其写入数据。 2.2 Hardware acceleration 硬件加速 应用程序使用目标的GPU来执…

云原生之深入解析亿级流量架构之服务限流思路与方法

一、限流思路 ① 熔断 系统在设计之初就把熔断措施考虑进去&#xff0c;当系统出现问题时&#xff0c;如果短时间内无法修复&#xff0c;系统要自动做出判断&#xff0c;开启熔断开关&#xff0c;拒绝流量访问&#xff0c;避免大流量对后端的过载请求。系统也应该能够动态监测…

【Vulnhub 靶场】【VulnCMS: 1】【简单】【20210613】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/vulncms-1,710/ 靶场下载&#xff1a;https://download.vulnhub.com/vulncms/VulnCMS.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年06月13日 文件大小&#xff1a;1.4 GB 靶场作者&#xff1a;to…

GoogLeNet(pytorch)

亮点与创新&#xff1a; 1. 引入Inception基础结构 2. 引入PW维度变换卷积&#xff0c;启迪后续参数量的优化 3. 丢弃全连接层&#xff0c;使用平均池化层&#xff08;大大减少模型参数&#xff09; 4. 添加两个辅助分类器帮助训练&#xff08;避免梯度消失&#xff0c;用于…

NXP应用随记(五):eMios功能点阅读随记

目录 1、概念点 2、eMios功能点 2.1、eMIOS - Single Action Input Capture (SAIC) 2.2、eMIOS - Single Action Output Compare (SAOC) 2.3、eMIOS - Double Action Output Compare (DAOC) 2.4、eMIOS - Pulse/Edge Counting (PEC) – Single Shot 2.5、eMIOS - Pulse/E…

rpc和http的区别,使⽤场景

rpc和http的区别&#xff0c;使⽤场景 区别如下&#xff1a;传输协议传输效率性能消耗负载均衡性能表现使用场景&#xff1a; 区别如下&#xff1a; 传输协议 RPC&#xff1a;可以基于TCP协议&#xff0c;也可以基于HTTP协议HTTP&#xff1a;基于HTTP协议 传输效率 RPC&…

贪吃蛇小游戏

目录 头文件代码 函数实现代码 测试时代码 本游戏的实现需要用到链表&#xff0c;结构体&#xff0c;win32API&#xff0c;枚举等相关知识。 头文件代码 #pragma once#include<locale.h> #include<stdlib.h> #include<Windows.h> #include<stdbool.h&…

K8S(五)—命名空间与资源配额

目录 命名空间(Namespace)命令计算资源配额创建命名空间绑定一个ResourceQuota资源将命名空间和资源限制对象进行绑定尝试创建第二个 Pod查看ResourceQuota 绑定第二个ResourceQuota为命名空间配置默认的 CPU 、memory请求和限制&#xff08;1&#xff09;Pod 中所有容器都没有…

[Verilog] 设计方法和设计流程

主页&#xff1a; 元存储博客 文章目录 1. 设计方法2. 设计流程 3 Vivado软件设计流程总结 1. 设计方法 Verilog 的设计多采用自上而下的设计方法&#xff08;top-down&#xff09;。设计流程是指从一个项目开始从项目需求分析&#xff0c;架构设计&#xff0c;功能验证&#…

智能客服的应用——政务领域

#本文来源清华大学数据治理研究中心政务热线数智化发展报告 &#xff0c;如有侵权&#xff0c;请联系删除。 面对地方政务热线发展所面临的挑战&#xff0c;数智化转型已经成为了热线系统突破当前发展瓶颈、实现整体提质增效的关键手段。《意见》中也明确指出&#xff0c;政务…

ChatGPT4 Excel 高级复杂函数案例实践

案例需求: 需求中需要判断多个条件进行操作。 可以让ChatGPT来实现这样的操作。 Prompt:有一个表格B2单元格为入职日期,C2单元格为员工等级(A,B,C),D2单元格为满意度分数(1,2,3,4,5)请给入职一年以上,员工等级为A级并且满意度在3分以上的人发4000元奖金,给入…

SoloLinker第一次使用记录,解决新手拿到板子的无所适从

本文目录 一、简介二、进群获取资料2.1 需要下载资料2.2 SDK 包解压 三、SDK 编译3.1 依赖安装3.2 编译配置3.3 启动编译3.4 编译后的固件目录 四、固件烧录4.1 RV1106 驱动安装4.2 打开烧录工具4.3 进入boot 模式&#xff08;烧录模式&#xff09;4.4 烧录启动固件4.5 烧录升级…

AntDesignBlazor示例——分页查询

本示例是AntDesign Blazor的入门示例&#xff0c;在学习的同时分享出来&#xff0c;以供新手参考。 示例代码仓库&#xff1a;https://gitee.com/known/BlazorDemo 1. 学习目标 分页查询框架天气数据分页功能表格自定义分页 2. 创建分页查询框架 Table组件分页默认为前端分…

1.electron之纯原生js/jquery的桌面应用程序(基础篇)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中&#xff0c;因此它允许你仅需一个代码仓库&#xff0c;就可以撰写支持 Windows、…

Mybatis-Plus——01搭建环境、快速入门(新注解、依赖)

搭建环境、快速入门 一、准备数据库二、创建项目三、导入依赖四、配置连接数据库五、编写实体类六、编写mapper接口七、主程序加MapperScan八、测试&#xff0c;输出查询结果————————创作不易&#xff0c;如觉不错&#xff0c;随手点赞&#xff0c;关注&#xff0c;收藏…

《科技风》期刊发表投稿方式、收稿方向

《科技风》杂志是经国家新闻出版总署批准&#xff0c;河北省科学技术协会主管&#xff0c;河北省科技咨询服务中心主办的国内公开发行的大型综合类科技期刊。 该刊集科技性、前瞻性、创新性和专业性于一体&#xff0c;始终以“把脉科技创新 引领发展风尚”为办刊宗旨&#xff…

spark-常用算子

一&#xff0c;Transformation变换/转换算子&#xff1a; 这种变换并不触发提交作业&#xff0c;这种算子是延迟执行的&#xff0c;也就是说从一个RDD转换生成另一个RDD的转换操作不是马上执行&#xff0c;需要等到有Action操作的时候才会真正触发。 1.Value数据类型的Transf…

vue中qrcanvas生成二维码并且下载二维码

vue中qrcanvas生成带logo二维码并且下载二维码 1.引入qrcanvas模块 cnpm install --save qrcanvas //parkage.json 中引入 "qrcanvas": "^3.1.2" import { qrcanvas } from qrcanvas2.前端vue页面展示 <el-buttonsize"mini"type"tex…