Android 开发日记-RecycleView

news/2024/7/20 23:06:53 标签: android, ios

简单列表实现

在app开发中列表肯定是最常见的样式,这里记录一下Android是如何使用RecyclerView创建动态列表的

类比一下 RecyclerView 相当于 iOS 中的 UITableView和UICollectionView

RecyclerView

RecyclerView 可以让您轻松高效地显示大量数据。您提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素。

顾名思义,RecyclerView 会回收这些单个的元素。当列表项滚动出屏幕时,RecyclerView 不会销毁其视图。相反,RecyclerView 会对屏幕上滚动的新列表项重用该视图。这种重用可以显著提高性能,改善应用响应能力并降低功耗。

RecyclerView 总的来说是列表元素的容器,然后复用View节省内容,提高性能。

RecyclerView 想要显示内容需要设置两个关键属性 layoutManageradapter

// 获取 recyclerView
recyclerView = findViewById(R.id.content_recycleview)
// 设置布局方式
recyclerView.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, true)
// 绑定 adapter
recyclerView.adapter = textAdapeter 

LayoutManager

  • LinearLayoutManager 线性布局,支持横向和纵向滑动,还可以翻转布局,翻转真的是适合做聊天室,因为翻转后布局的最后一条显示在屏幕的最下方。这一点iOS望尘莫及啊!
  • GridLayoutManager 二维网格排列,这个和 iOS 的 UICollectionView 的排列就很像了,没啥可说的。
  • StaggeredGridLayoutManager 和上面类似,但是同一列元素的高度可以不一样,不知道这个可不可以做瀑布流。

RecycleView示例图.png

RecyclerView.Adapter 和 RecyclerView.ViewHolder

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;
    }
    ...
} 
  • 一个 RecyclerView 同时只对应一个 Adapter
  • 自定义的 Adapter 继承的时候需要指定一个 ViewHolder
  • ViewHolder 初始化需要传入 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() 

实现多种样式

实际应用中,列表中显示的内容不可能永远都是一种样式,那么多样式是怎么实现的那这里记录一下

方法1

根据 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
} 

方法2 ConcatAdapter

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 

screenshot_20220417_162949.png

文末

如果要想成为Android架构师,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

一、架构师筑基必备技能

1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO
……

在这里插入图片描述

二、Android百大框架源码解析

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 源码分析——图片加载流程

在这里插入图片描述

三、Android性能优化实战解析

  • 腾讯Bugly:对字符串匹配算法的一点理解
  • 爱奇艺:安卓APP崩溃捕获方案——xCrash
  • 字节跳动:深入理解Gradle框架之一:Plugin, Extension, buildSrc
  • 百度APP技术:Android H5首屏优化实践
  • 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
  • 携程:从智行 Android 项目看组件化架构实践
  • 网易新闻构建优化:如何让你的构建速度“势如闪电”?

在这里插入图片描述

四、高级kotlin强化实战

1、Kotlin入门教程
2、Kotlin 实战避坑指南
3、项目实战《Kotlin Jetpack 实战》

  • 从一个膜拜大神的 Demo 开始

  • Kotlin 写 Gradle 脚本是一种什么体验?

  • Kotlin 编程的三重境界

  • Kotlin 高阶函数

  • Kotlin 泛型

  • Kotlin 扩展

  • Kotlin 委托

  • 协程“不为人知”的调试技巧

  • 图解协程:suspend

在这里插入图片描述

五、Android高级UI开源框架进阶解密

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使用指南
在这里插入图片描述

六、NDK模块开发

1、NDK 模块开发
2、JNI 模块
3、Native 开发工具
4、Linux 编程
5、底层图片处理
6、音视频开发
7、机器学习

在这里插入图片描述

七、Flutter技术进阶

1、Flutter跨平台开发概述
2、Windows中Flutter开发环境搭建
3、编写你的第一个Flutter APP
4、Flutter开发环境搭建和调试
5、Dart语法篇之基础语法(一)
6、Dart语法篇之集合的使用与源码解析(二)
7、Dart语法篇之集合操作符函数与源码分析(三)

在这里插入图片描述

八、微信小程序开发

1、小程序概述及入门
2、小程序UI开发
3、API操作
4、购物商场项目实战……

在这里插入图片描述

全套视频资料:

一、面试合集
在这里插入图片描述
二、源码解析合集

在这里插入图片描述
三、开源框架合集

在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接点击文末CSDN官方认证微信卡片免费领取【保证100%免费】↓↓↓
在这里插入图片描述


http://www.niftyadmin.cn/n/1458608.html

相关文章

Android开源框架:Retrofit

1 简述 A type-safe HTTP client for Android and Java. Retrofit 是基于RESTful风格的 HTTP 网络请求框架的封装。它的底层仍然基于OkHttp实现&#xff0c;算是OkHttp在Android上使用的改良。 // 这是一个例子 Retrofit retrofit new Retrofit.Builder().baseUrl("htt…

Android-TextView跑马灯探秘

前言 自定义View实现的跑马灯一直没有实现类似 Android TextView 的跑马灯首尾相接的效果&#xff0c;所以一直想看看Android TextView 的跑马灯是如何实现 本文主要探秘 Android TextView 的跑马灯实现原理及实现自下往上效果的跑马灯 探秘 TextView#onDraw 原生 Android…

Android搭建无线调试环境

记录一下自己搭建Android手机的无线调试环境的一波三折&#xff01; ADB 安卓官网对此工具的介绍 Android 调试桥 (adb) 是一种功能多样的命令行工具&#xff0c;可让您与设备进行通信。adb 命令可用于执行各种设备操作&#xff08;例如安装和调试应用&#xff09;&#xff0c…

【Android开发】事件分发和处理机制

前言 我们首先要知道&#xff0c;Android 中的事件是用 MotionEvent 对象来表示&#xff0c;那么它的哪些类型呢&#xff1f; 事件类型触发时机ACTION_DOWN手指初接触到屏幕时触发ACTION_MOVE手指在屏幕上滑动时触发&#xff0c;会多次触发ACTION_UP手指离开屏幕时触发ACTION…

【Android开发】2022Android官方架构指南

文章详细的介绍了2022Android官方架构指南&#xff0c;对于中高级的开发者而言都具有很高的价值。文章主要分以下几个部分&#xff1a; Arch - 概述Arch - UI LayerArch - Domain LayerArch - Data LayerArch - 总结 一、概述 &#x1f4cc; 名词解释 DataSource&#xff1…

【Android开发】计算机网络基础知识点,如何完成网络请求过程?

&#xff08;一&#xff09;计算机网络基础知识&#xff1a;从一次完整的网络请求过程分析 &#xff08;1&#xff09;域名解析 1.1&#xff09;域名与ip地址 &#xff08;1&#xff09;ip地址&#xff1a;ip地址是一个32位&#xff08;4字节&#xff09;的二进制数&#xf…

【Android开发】算法题合集(一)二叉树和反转字符串

Android面试题算法篇&#xff0c;由本人整理汇总&#xff0c;后续将继续推出系列篇&#xff0c;如果喜欢请持续关注和推荐&#xff0c;更多精彩内容可以扫描文末二维码加v获得更多咨询~ &#x1f332;真题一&#xff1a;二叉树的所有路径 给定一种规律 pattern 和一个字符串 s…

【Android开发】算法题合集(二)相对名次和反转字符串中的元音字母

Android面试题算法篇&#xff0c;由本人整理汇总&#xff0c;后续将继续推出系列篇&#xff0c;如果喜欢请持续关注和推荐&#xff0c;更多精彩内容可以扫描文末二维码加v获得更多咨询~ 上接&#xff1a;【Android面试】算法题合集&#xff08;一&#xff09;二叉树和反转字符…