蜗牛君漫聊动态布局框架(二):核心功能的思路与实现

2023-11-07

Hello! 大家好,我是蜗牛君~ 我们又见面了,本篇文章是蜗牛君漫聊动态布局框架的第二篇。上一篇中我们讲解了框架的大致思路,以及复习了一下RecyclerView的基础使用方式。那么本篇文章我们就正式开始框架的搭建了。

首先我们要做一件事情,就是捋清楚整个框架的搭建思路。

思路讲解

1、思路的起点:getItemViewType(int position)方法

只要是有Android原生开发经验的朋友都知道在RecyclerView出现之前,我们一直熟练使用的是ListView,为了解决ListView的一些不理想之处,所以出现了RecyclerView,但是ListView的大部分功能RecyclerView还是继承了。蜗牛君在很久之前使用ListView做开发时就遇到过一个需求,在新闻列表中要穿插广告,广告的布局样式和新闻布局完全不同,这个需求很常见,所以蜗牛君在网上很轻易的就查到了大量的文章,这些文章的内容大同小异,他们都有一个共同点,那就是使用Adapter的getItemViewType(int position)方法。

于是蜗牛君就在网上查了一下这个方法的用途。大概意思就是说在Adapter创建ViewHolder之前,会先通过getItemViewType方法判断数据的类型,可以根据getItemViewType方法不同的返回值,确定加载不同的ViewHolder。因此,getItemViewType方法就是思路的起点。

那我们在getItemViewType方法中做什么呢?由于getItemViewType方法的返回值是int类型,因此这个int类型的值要能够确定ViewHolder的具体类型。

2、数据类型和ViewHolder类型对应关系的存储

我们框架的原理就是根据不同类型的数据选择不同类型的ViewHolder,因此这份一一对应的关系如何存储至关重要。

我们的思路是使用HashMap集合,数据类型的Class类为Key值,ViewHolder类的Class类为Value值,这样就把一一对应的关系存储起来了。

既然我们存储的是Class类,因此在实例化的时候就需要用到Java的反射机制了,这也就是动态的体现。

3、数据和ViewHolder对应关系的查询

在HashMap集合中,Key值是数据类型的Class类,我们接下来要思考的问题是如何确定Key值。上文提到过,getItemViewType方法返回的数据类型是int类型,而我们HashMap中存储的Key值是Class类型,这完全不匹配啊!我们的策略是中间增加一层,建立Key值的索引目录。

具体来讲就是,我们在初始化时,要进行一步存储操作,这步操作包含两项:第一项就是将数据类型的Class类依次存入ArrayList集合;第二项是依次将数据与ViewHolder

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蜗牛君漫聊动态布局框架(二):核心功能的思路与实现 的相关文章

  • 如何创建在 React-Native 中检测自动位置的地图

    我已经在react native中创建了地图 参考https github com lelandrichardson react native maps https github com lelandrichardson react nat
  • 使用DBFlow,如何加密已经存在的数据库?

    我正在使用 DBFlow 来处理项目中的数据库 并且我想对现有数据库进行加密 我知道我可能必须删除现有的未加密数据库并创建另一个加密数据库 我也知道我可以将 SQLCipher 与 DBFlow 一起使用 如上所述文档 https gith
  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 我无法再在后台应用程序中接收任何 FCM 消息

    当应用程序处于后台时 我无法再在应用程序中接收任何数据消息 请注意 直到最近它在我的应用程序中都运行良好 也许在我的开发环境最近更新后它停止工作了 我不能说 所以我尝试用快速入门 android 项目 https github com fi
  • CoordinatorLayout 和 ImageView 在滚动时调整宽度的问题

    我正在尝试放置一个ImageView in a CollapsingToolbarLayout它在加载时占据整个屏幕 并且当您滚动内容时 16x9 分辨率图像宽度会调整大小 直到图像占据屏幕的整个宽度 那时 我希望图像具有视差app lay
  • 自动删除 Firebase 通知

    我有一个问题 我都读过让通知在 5 分钟后消失 https stackoverflow com questions 15648699 make notification disappear after 5 minutes and 几秒钟后清
  • 如何使用 Google 的 GithubBrowserSample 方法在片段之间共享视图模型?

    我对 Android 架构组件的使用非常陌生 因此我决定使用 GithubBrowserSample 来构建我的应用程序来实现我的许多用例 但我有一个问题 我不知道使用这种方法在片段之间共享视图模型的正确方法是什么 我想共享视图模型 因为我
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Android 中加密/解密字符串的简单方法

    我的问题是如何加密String String AndroidId Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • 模拟器无法加载

    我正在使用 hello android 教程并通过 eclipse 创建 avd 启动模拟器时不使用图像 它只是显示一个黑色的后屏 中间有 ANDROID 字样 并且在 ANDROID 字样的末尾有一个闪烁的光标 我已按照 T 的步骤安装
  • Android:WebView/BaseInputConnection 中的退格键

    我在 Android 4 2 中遇到软键盘退格问题 我在 WebView CodeMirror 中有一个自定义编辑器 它使用一个空的
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 如何在Android模拟器中隐藏应用程序图标?

    我有一个应用程序在启动完成后自动启动 但应用程序图标显示在android模拟器中 现在我想向用户隐藏该图标 这样用户就无法知道应用程序已启动 并且他们无法启动该应用程序手动申请 在您的 AndroidManifest xml 文件中 您可能
  • Android 操作项上的通知徽章

    我想在操作栏中放置的购物车图像上添加一个通知徽章 并以编程方式操作它 有帮助吗 您可以显示自定义MenuItem on ActionBar通过创建一个custom layout for MenuItem 要设置自定义布局 您必须使用菜单项属
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • 如何知道我的应用程序的活动计数?

    我的应用程序中有多项活动 请考虑以下案例 Activity A 调用 Activity B B 调用 C 当用户按后退键时 C 生成通知并转到 B 现在再次按后退 因此将显示 A 再次按后退键也会终止 A 并显示通知 现在 当用户按下通知图
  • XML 配置中的 screenName 不起作用

    我刚刚在我的应用程序中添加了对 Google Analytics 分析 的支持 但我无法
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这
  • 如何用LoaderManager自动重新查询

    我有一个应用程序显示来自 SQLite DB 的数据 并且数据不断变化 所以显然 我认为我应该使用 LoaderManager 来显示数据 我读过一些关于将 LoaderManager 与 SQLite 结合使用的内容 然后看到了亚历克斯

随机推荐

  • 亲测有效,如何用ChatGPT 生成高质量原创视频

    尽管ChatGPT目前缺乏视频生成的能力 但我们可以借助插件实现视频生成 特别是对于那些从事Tiktok海外运营的用户而言 Visla和HeyGen是我目前测试的两款可生成视频的插件 首先登陆您的ChatGPT帐号 并单击邮箱 勾选设置 S
  • CUDA的作用

    显卡中CUDA是什么及作用介绍 CUDA Compute Unified Device Architecture 显卡厂商NVidia推出的运算平台 CUDA是一种由NVIDIA推出的通用并行计算架构 该架构使GPU能够解决复杂的计算问题
  • 联合memcache,repcached,magent,monit四个组件搭建高可用集群方案

    一 基本介绍 1 组件承担的角色 1 memcache负责缓存对象 2 repcached负责单主单从的同步备份 3 magent代理实现N主N备 4 monit监听以上组件的各个实例端口 保证故障自动重启 2 集群思路 1 利用repca
  • Unlock PeopleSoft Objects All at Once

    Change control is used in Application Designer to lock definitions and track history changes for each object Change cont
  • 图解NCHW与NHWC数据格式

    图解NCHW与NHWC数据格式 田海立 CSDN CSDN博客 nchw 流行的深度学习框架中有不同的数据格式 典型的有NCHW和NHWC格式 本文从逻辑表达和物理存储角度用图的方式来理解这两种数据格式 最后以RGB图像为例来加深NHWC和
  • Adam优化算法详细解析

    本文转载于以下博客地址 http www atyun com 2257 html 如有冒犯 还望谅解 Adam优化算法是一种对随机梯度下降法的扩展 最近在计算机视觉和自然语言处理中广泛应用于深度学习应用 在引入该算法时 OpenAI的Die
  • 使用nginx实现负载均衡

    一 什么是负载均衡 随着互联网的发展 业务流量越来越大并且业务逻辑也越来越复杂 使用单台机器可能会造成性能问题和单点故障 因此需要多台机器来进行性能的水平扩展以及避免单点故障 为了将不同的用户的流量分发到不同的服务器上面 保持每台机器处理请
  • J-Link RTT调试的初始介绍

    1 RTT简介 RTT全称是Real Time Transmit 实时传输 是Segger公司推出的调试手段之一 它是一种用于嵌入式中与用户进行交互的技术 使用RTT可以从MCU快速输出调试信息和数据 且不影响MCU的实时性 只要支持J L
  • 渲染页到详情页到加入购物车

    1 渲染 拿到数据放在自己的data渲染 data headerList class tabid index active tabid点击时的下标 index是数组下标 active是选中时状态 分类功能 click handfenl it
  • 数据挖掘主要解决的四类问题

    数据挖掘主要解决的四类问题 数据挖掘非常清晰的界定了它所能解决的几类问题 这是一个高度的归纳 数据挖掘的应用就是把这几类问题演绎的一个过程 下面让我们来看看它所解决的四类问题是如何界定的 1 分类问题 分类问题属于预测性的问题 但是它跟普通
  • yolo目标检测图片时,png出问题(花掉),bmp、jpg等其他格式没问题

    yolo做目标检测的时候 当输入图片是png的时候 整个图片会花掉 如图所示 研究了好久 是因为png是8位 bmp jpg是24位 所以要将8位转换成24位 这里参考了 https blog csdn net qq 17130909 ar
  • ORA-01578(数据块损坏) 转

    当Oracle数据库出现坏块时 Oracle会在警告日志文件 alert SID log 中记录坏块的信息 ORA 01578 ORACLE data block corrupted file 7 block
  • wxWidgets简单的多线程

    include
  • vue el-tree:默认展开第几级节点

    需求描述 Tree 树形结构 默认展开第二级菜单 查 element 文档 解决方法 设置 default expanded keys 的值为 idArr 数组
  • JVM——查看full gc频率(jstat -gc)

    问题 如何查看系统的full gc频率 思路 使用JVM工具jstat查看 步骤 1 运行jps获取进程号 jps 2 目标进程9 监控JVM 每5秒打印一次 jstat gc 9 5000 说明 S0C 幸存区1的大小 S1C 幸存区2的
  • 多线程(四)线程的状态及生命周期

    目录 一 线程的状态 新建 初始 就绪 可运行 运行 阻塞 死亡 二 线程的状态转移 NEW RUNNABLE TERMINATED 状态的转移 yield 方法 让出 CPU执行权 三 线程的生命周期 一 线程的状态 NEW 安排了工作
  • Redis数据类型-hash

    一 概述 Redis中hash类型可以具有String key和String value的map容器 所以该类型非常适合存储值对象的信息 如username password和age等 如果hash中包含很少的字段 那么该类型的数据也将仅占
  • 华为无盘服务器,无盘服务器操作系统

    无盘服务器操作系统 内容精选 换一换 本节操作介绍购买云耀云服务器的操作步骤 购买时 为减少您配置参数的时间 部分参数由系统自动分配 以下参数配置供你了解系统的默认配置 购买云耀云服务器仅支持 包年 包月 的计费方式 请您在购买前确保已完成
  • Web实现前后端分离,前后端解耦

    点击上方 Java之间 选择 置顶或者星标 你关注的就是我关心的 作者 山河远阔 来源 https blog csdn net weixin 37539378 article details 79956760 上一篇 面试官 数据量很大 分
  • 蜗牛君漫聊动态布局框架(二):核心功能的思路与实现

    Hello 大家好 我是蜗牛君 我们又见面了 本篇文章是蜗牛君漫聊动态布局框架的第二篇 上一篇中我们讲解了框架的大致思路 以及复习了一下RecyclerView的基础使用方式 那么本篇文章我们就正式开始框架的搭建了 首先我们要做一件事情 就