赞
踩
在app开发中列表肯定是最常见的样式,这里记录一下Android是如何使用RecyclerView创建动态列表的
类比一下 RecyclerView 相当于 iOS 中的 UITableView和UICollectionView
RecyclerView 可以让您轻松高效地显示大量数据。您提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素。
顾名思义,RecyclerView 会回收这些单个的元素。当列表项滚动出屏幕时,RecyclerView 不会销毁其视图。相反,RecyclerView 会对屏幕上滚动的新列表项重用该视图。这种重用可以显著提高性能,改善应用响应能力并降低功耗。
RecyclerView 总的来说是列表元素的容器,然后复用View节省内容,提高性能。
RecyclerView 想要显示内容需要设置两个关键属性 layoutManager
和 adapter
// 获取 recyclerView
recyclerView = findViewById(R.id.content_recycleview)
// 设置布局方式
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, true)
// 绑定 adapter
recyclerView.adapter = textAdapeter
Adapter 用 iOS 的话说就是 UITableView 的 dataSource 了
ViewHolder 持有 itemView, 也就是相当于给 Cell 包装了一层
public abstract static class Adapter<VH extends ViewHolder> { ... } public abstract static class ViewHolder { @NonNull public final View itemView; ... public ViewHolder(@NonNull View itemView) { if (itemView == null) { throw new IllegalArgumentException("itemView may not be null"); } this.itemView = itemView; } ... }
在看一下继承 Adapter 需要实现的方法
import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView // 定义MyAdapter class MyAdapter: RecyclerView.Adapter<MyAdapter.MyViewHolder>() { // 定义 ViewHolder class MyViewHolder(view: View): RecyclerView.ViewHolder(view) { } // 需要在这里对ViewHolder实例化 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { // 先实例化一个 itemView val itemView = LayoutInflater.from(parent.context).inflate(R.layout.cell_text, parent, false) // 在实例化 ViewHolder return MyViewHolder(itemView) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { // 这里就是可以根据 holder 获取 itemView holder.itemView // 然后就可以嘿嘿嘿,不用说了吧 } override fun getItemCount(): Int { // 返回显示的个数,这个不用说了吧 } }
然后给 recyclerView 设置下布局,绑定下adapter OK了。
// 设置布局方式
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, true)
// 绑定 adapter
recyclerView.adapter = MyAdapeter()
实际应用中,列表中显示的内容不可能永远都是一种样式,那么多样式是怎么实现的那这里记录一下
根据 viewType 在 onCreateViewHolder 中返回不同的 View, 复用规则是根据 viewType 的值来的(盲猜一下应该是这样)
abstract class MyViewHolder(view: View): RecyclerView.ViewHolder(view) { ... } class MyTextViewHolder(view: View): MyViewHolder(view) { ... } class MyImageViewHolder(view: View): MyViewHolder(view) { ... } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val itemView = ... val itemView2 = ... // plan 1 if (viewType == 1) { return MyTextViewHolder(itemView) } else { return MyImageViewHolder(itemView2) } // plan 2 if (viewType == 1) { return MyTextViewHolder(itemView) } else { return MyTextViewHolder(itemView2) } } override fun getItemViewType(position: Int): Int { if (position < 10) return 1 return 2 }
implementation 'androidx.recyclerview:recyclerview:1.2.1'
ConcatAdapter 像iOS里面的 Section 概念
ConcatAdapter 可以将多个不同的 Adapter 当作一个个单独的 Section 处理
// 初始化adapter
val textAdapeter = MyAdapter()
val imageAdapter = MyAdapter2()
// 绑定 adapter
val dAdapter = ConcatAdapter(textAdapeter, imageAdapter)
recyclerView.adapter = dAdapter
如果要想成为Android架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……
1.Retrofit 2.0源码解析
2.Okhttp3源码解析
3.ButterKnife源码解析
4.MPAndroidChart 源码解析
5.Glide源码解析
6.Leakcanary 源码解析
7.Universal-lmage-Loader源码解析
8.EventBus 3.0源码解析
9.zxing源码分析
10.Picasso源码解析
11.LottieAndroid使用详解及源码解析
12.Fresco 源码分析——图片加载流程
1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》
从一个膜拜大神的 Demo 开始
Kotlin 写 Gradle 脚本是一种什么体验?
Kotlin 编程的三重境界
Kotlin 高阶函数
Kotlin 泛型
Kotlin 扩展
Kotlin 委托
协程“不为人知”的调试技巧
图解协程:suspend
1.SmartRefreshLayout的使用
2.Android之PullToRefresh控件源码解析
3.Android-PullToRefresh下拉刷新库基本用法
4.LoadSir-高效易用的加载反馈页管理框架
5.Android通用LoadingView加载框架详解
6.MPAndroidChart实现LineChart(折线图)
7.hellocharts-android使用指南
8.SmartTable使用指南
9.开源项目android-uitableview介绍
10.ExcelPanel 使用指南
11.Android开源项目SlidingMenu深切解析
12.MaterialDrawer使用指南
1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习
1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)
…
1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……
一、面试合集
二、源码解析合集
三、开源框架合集
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取【保证100%免费】↓↓↓
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。