我从多个维度对比它们的区别: 角度 findViewById ButterKnife Kotlin Synthetics DataBinding ViewBinding ❓ 简洁性 ✖ ✖ ✔ ✔ ✔...ViewBinding 与 Kotlin 委托双剑合璧 到这里,ViewBinding 的使用教程已经说完了。但是回过头看,有没有发现一些局限性呢?...利用了 Kotlin 内敛函数 + 实化类型参数,编译后函数体整体被复制到调用处,V::class.java 其实是 FragmentTestBinding::class.java。...Kotlin 高阶函数,可以把 lambda 表达式直接作为参数传递,其中 View 是函数参数,而 T 是函数返回值。lambda 表达式本质上是 「可以作为值传递的代码块」。...显然并不是,我们还有其他一些场景: Activity Fragment DialogFragment ViewGroup RecyclerView.ViewHolder 所以,我们有必要将委托工具适当封装得更通用些
向 AndroidX 迁移 Nick Anthony 发布了一篇关于如何从 Support 库迁移到 AndroidX 的文章,地址如下: https://medium.com/androiddevelopers...v=j8xeUqKylBE&list=PLNUr_cTShrWZNKJlnurh5MB1wkSEU2nlw&index=5&t=0s Kotlin 首先是关于 协程 的一个视频 Kotlin Coroutines...v=wAQCs8-a6mg&feature=youtu.be 对于内联函数,编译器会把函数代码直接复制到函数调用处,以此来消除当参数类型是 lambda 时带来的额外的内存消耗。...大家肯定都了解了如何在 ViewModel/LiveData/Lifecycle 中正确的使用协程,使得在恰当的情况下可以取消协程,比如用户离开当前页面。...最新的 recyclerview-1.2.0 中发布了 MergeAdapter ,你可以将多个 Adapter 合并为一个。
历经13年的打磨和沉淀,Android体系与社区生态已非常成熟,开发者从最初的框架少、没规范、代码都得自己写,到轮子、框架满天飞。...Android Jetpack 向后兼容,是为现代设计实践而设计的,如关注点分离、测试能力、松散耦合、观察者模式、控制翻转、Kotlin集成等生产力特性。...Data Binding→数据绑定,可使用声明式将布局中的界面组件绑定到应用中的数据源; Lifecycles→生命周期感知,可感知和响应Activity和Fragment的生命周期状态的变化; LiveData...被杀、或设备重启,只要TaskRecord还存在最近访问列表中,都会执行; Foundation → 基础 提供横向功能,如:向后兼容、测试、安全、Kotlin语言支持; AppCompat→ 帮助较低版本的...2.从手写findViewById 到ViewBinding 从早期对照XML手写findViewById,到在线工具自动生成: [07b5ac996d054bd96e7533426d9003b2.png
下面的代码会使用 Kotlin 语言,但是 RecyclerView 也可以在 Java 语言中使用。...布局 接下来,在 activity_main 布局文件中将 TextView 替换为 RecyclerView,并且将其 layoutManager 设置为 LinearLayoutManager。...Adapter 类从数据源获得数据,并且将数据传递给正在更新其所持视图的 ViewHolder。下图显示了 RecyclerView、Adapter、ViewHolder 和数据之间的协作关系。...该位置可以用于提取表项所需的数据,并且将数据传递给 ViewHolder 来使数据绑定到对应的 UI。
在Kotlin中,扩展函数是一种非常有用的功能,可以让我们向现有的类添加新的功能,而无需修改类的源代码。在本文中,我们将探讨Kotlin扩展函数的原理和运用,以及如何在Android开发中使用它们。...当我们使用扩展函数调用一个类的方法时,编译器会将这个函数转换为一个静态方法,并将这个类的实例作为第一个参数传递进去。...的使用 在Android开发中,我们经常需要使用RecyclerView来显示列表数据。...例如,我们可以像下面这样定义一个扩展函数,用于在RecyclerView中添加和移除数据: fun RecyclerView.addItems(items: List, adapter:...(items) adapter.notifyDataSetChanged() } 在上面的代码中,我们定义了两个扩展函数,一个用于向RecyclerView中添加数据,一个用于移除RecyclerView
资源下载 下面是《Android Studio开发实战 从零基础到App上线》一书用到的工具和代码资源: 1、本书使用的Android Studio版本为3.0.1,Kotlin版本为1.2.0...勘误记录 下面对书中的笔误之处进行更正说明: 1、第6页的“1.2.3 创建Kotlin工程” 第二段里面的“不过因为如通知的新特性从API16开始才支持”改为“不过因为通知推送的新特性从API16...开始才支持”,也就是把“如通知”改为“通知推送”。...13、第171页的“7.2.3 应用栏布局AppBarLayout” 第一段第二行末尾“RecyclerView是身怀的绝技之一”改为“RecyclerView是身怀绝技的其中一个控件”。...20、第291页的“10.1.1 大线程Thread与消息传递” 该小节的标题“10.1.1 大线程Thread与消息传递”改为“10.1.1 线程Thread与消息传递”,也就是去掉标题里面的“
不过,好在ViewBinding并不复杂,从kotlin-android-extensions插件切换到ViewBinding也是比较容易的,那么本篇文章就作为《第一行代码 第3版》的另外一篇DLC,向大家介绍一下...当然这个我认为并不是主要原因,因为现在Google开发的各种新技术都在全面兼容Kotlin,而不再怎么去考虑Java了,如协程、Jetpack Compose等。 那么主要原因是什么呢?...这样当下次再获取相同控件实例的话,就可以直接从HashMap缓存中获取了。 这就是kotlin-android-extensions插件的实现原理,其实还是非常简单的。...还有,虽然HashMap是一种O(1)时间复杂度的数据结构,但这毕竟只是理论上的时间复杂度,实际调用肯定是没有直接访问控件实例快的,因此kotlin-android-extensions插件也在无形当中降低了程序的运行效率...讲完了kotlin-android-extensions插件的“坑”,接下来我们还是看一下如何在Adapter中使用ViewBinding,别忘了我们的目标始终是不写findViewById。
从 95% 降低到 Java 85%, 而 Kotlin 从 5% 涨到 15% ,如下图所示 ?...在该版本中提供了许多方便实用的功能如代码自动补全和语法高亮显示,另外,Android Studio 内置转换工具可以非常方便地把 Java 代码转换成 Kotlin 代码,如下图所示 ?...当Fragment被detach后,执行attach操作,会让Fragment从onCreateView开始执行,一直执行到onResume。attach无法像add一样单独使用,单独使用会抛异常。...当执行一个 Fragment 事务时,也可以将该 Fragment 加入到一个由宿主 Activity 管辖的后退栈中,并由 Activity 记录加入到后退栈的 Fragment 信息,按下后退键可以将...Fragment 从后退栈中一次弹出。
Kotlin Flow是基于kotlin协程的一套异步数据流框架,可以用于异步返回多个值。...考虑使用kotlin协程中的Channel替代。...显然并不合适,因为首先直观上冷流就无法在构造器以外发射数据。 但实际上答案并不绝对,通过在flow构造器内部使用channel,同样可以实现动态发射,如channelFlow。...但考虑到DialogFragment的存活周期是宿主Activity的子集,所以这里没有大问题。...单向数据流,任何状态的变化都来自事件,因此更容易定位出问题。 理想情况下对View层和ViewModel层做了接口隔离,更加解耦。 状态、事件从架构层面上就明确划分,便于约束开发者写出漂亮的代码。
所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接从持有者处获得先前的视图对象,从而减少了系统开销,提高了系统的运行效率。...下面便是个循环视图的网格适配器,它实现了类似淘宝主页的网格频道栏目,具体的Kotlin代码如下所示: //把公共属性和公共方法剥离到基类RecyclerBaseAdapter, //此处仅需实现getItemCount...注意到适配器代码仍然通过findViewById方法获得控件对象,可是号称在Anko库的支持之下,Kotlin早就无需该方法就能直接访问控件对象了呀,为啥这里依旧靠老牛拉破车呢?...; 2、列表项信息的数据结构名称,如RecyclerInfo; 3、对各种控件对象的设置操作,如ItemHolder类的bind方法; 除了以上三个要素,RecyclerStaggeredAdapter...对于第一个的布局编码,可以考虑将其作为一个整型的输入参数;对于第二个的数据结构,可以考虑定义一个模板类,在外部调用时再指定具体的数据类;对于第三个的bind方法,若是Java编码早已束手无策,现用Kotlin
启动一个 Theme 为 Dialog 的 Activity,弹出Dialog时Activity的生命周期 onStart 和 onResumeonPause 和 onStop 的区别 Activity之间传递数据的方式...Intent是否有大小限制,如果传递的数据量偏大,有哪些方案 Activity的onNewIntent()方法什么时候会执行 显示启动和隐式启动 scheme使用场景,协议格式,如何使用 ANR 的四种场景...onCreate和onRestoreInstance方法中恢复数据时的区别 activty间传递数据的方式 跨App启动Activity的方式,注意事项 Activity任务栈是什么 有哪些Activity...分组原理是什么 Dialog的Context只能是Activity的Context,不能是Application的Context App应用程序如何与SurfaceFlinger通信的,View 的绘制是如何把数据传递给...Android优秀三方库源码 2.Jetpack架构组件从入门到精通 Android Jetpack - Navigation Android Jetpack - Data Binding Android
可配置的RecyclerView适配器,会在用户滚动到已加载数据的末尾时自动请求数据。 对Kotlin协程和Flow以及LiveData和RxJava的一流支持。...列表直接从数据库中获取数据。...PagedList PagedList负责通知DataSource何时获取数据,如加载第一页、最后一页及加载数量等。从DataSource获取的数据将存储在PagedList中。...如获取数据携带page和pageSize时。...,通过LiveData传递,最后通过Adapter.submitList()刷新数据。
协程 看这一篇就够了 Kotlin Flow 看这一篇 带你入门~ 项目示例 在官方文档中也给出了我们Paging在架构中的使用图 ?...通过上图我们也可以清晰的看出来,Paging在仓库层、ViewModel和UI层都有具体的表现,接下来我们通过一个示例来逐步讲解Paging是如何在项目架构中工作的。...,这里的意思就是 我们传Int类型的值(如页码)得到返回的数据信息DemoReqData对象。...这里需要提醒的是如果你使用的不是Kotlin 协程而是Java,则需要继承对应的PagingSource如RxPagingSource或ListenableFuturePagingSource。...View层数据请求并将结果显示在View上 到这里,基本工作已经差不多了,当然我们说的差不多了只是快能看到成果了,其中需要讲解的地方还有很多,最后一步我们在view中请求数据,并将结果绑定在adapter
可能还想扩展几个子类,而非 Fragment 基类: DialogFragment 显示浮动对话框。...ExampleFragment(); fragmentTransaction.add(R.id.fragment_container, fragment); fragmentTransaction.commit(); 传递到...从手机到平板电脑。 Fragment 是一个独立的模块,紧紧地与 activity 绑定在一起。可以运行中动态地移除、加入、交换等。...Activity向Fragment传值: 将要传的值,放到bundle对象里; 在Activity中创建该Fragment的对象fragment, 通过调用 fragment.setArguments()传递到...此时左右两个 Fragment 都会执行从 onAttach->….->onResume 的生命周期,明明 Fragment 没有显示却已经到onResume 了,在某些情况下会出现问题。
Gson 可以直接设置使用序列化的注解,这样就可以直接混淆model了,另外 model 不写get 或者 set 的方法也挺好,即减少了方法数量,调用的时候也相对方便,当然判空还是必须的,毕竟这不是 Kotlin...链接 29、 RecyclerView 更新数据如果有动画的话,那么应该先清除所有的数据,再添加新的数据,不然动画效果和以前的列表会同时出现,特别诡异。...33、关于系统权限弹框,联想手机上面会影响到宿主 Activity 的状态,会回调 onSaveInstanceState() 的方法,如果在这之后需要弹出DialogFragment或者 执行FragmentTransaction...、绑定 holder,数据无法做到复用。...最优方案是考虑给这种类型每个 holder 都设置不同的 type,保证唯一性,这样就可以实现创建一次,holder 不被复用,数据可复用。
在 main 包中创建一个新的 Kotlin 文件并命名为 MyDialog.kt。...创建一个新的从 FirstFragment 导航到对话框的操作 我们还需要额外的一步才可能导航到这个对话框。...如果我们查看 DonutList 的代码,该 fragment 包含了那个展示列表数据的 RecyclerView,我们可以发现导航是如何被处理的。...其次,我们从 FAB 导航时 (不需要传递参数给 Directions 对象) 调用 navigate() 方法和从甜甜圈列表中任一列表项导航时 (需要传递 donut.id) 不太一样。...如您所见,我已经预先在应用中输入了一些重要的甜甜圈数据: ? DonutTracker 应用展示着一个诱人的甜甜圈列表 点击 FAB,我们可以看到一个待输入新甜甜圈信息的对话框: ?
Android分页包能够更轻易地在RecyclerView里面缓慢且优雅地加载数据. 许多应用从数据源消耗数据, 数据源里面有大量的数据, 但是一次却只展示一小部分....分页包支持多样的应用架构, 包括脱机数据库和与后台服务器通讯的数据库. UI PagedList类通过PagedListAdapter加载数据项到RecyclerView里面....更新已有应用 如果应用已经从网络或者数据库消费数据, 很大可能可以直接升级到分页库提供的功能....你也可以使用Java中的Object.equals()方法或者Kotlin中的==操作符. 但是要确保要么实现了对象中的equals()方法或者使用了kotlin中的数据对象....如果你想要对分布包从数据库加载中设置更多的控件, 要像下面的代码一样, 传递自定义的Executor对象给LivePagedListBuilder: EventViewModel.kt: val myPagingConfig
9.kotlin ?的原理 10.在项目中有直接使用tcp,socket来发送消息吗 11.如何在网络框架里直接避免内存泄漏,不需要在presenter中释放订阅 12.生命周期都是通过什么调用的?...利用什么传递数据 10.Jvm的内存结构,Jvm的垃圾回收,方法区有什么东西?...kotlin的泛型了解吗?泛型的pecs原则 7.同步屏障 8.性能优化做过什么工作? 9.RecyclerView的缓存结构是怎样的?缓存的是什么?...,事件怎么传递 12.Launcher启动图标,有几个进程?...Android优秀三方库源码 2.Jetpack架构组件从入门到精通 Android Jetpack - Navigation Android Jetpack - Data Binding Android
kotlin ?的原理 在项目中有直接使用tcp,socket来发送消息吗 如何在网络框架里直接避免内存泄漏,不需要在presenter中释放订阅 生命周期都是通过什么调用的?有用过AIDL吗?...Seriazable与Parceable的区别 Bundle是什么数据结构?利用什么传递数据 Jvm的内存结构,Jvm的垃圾回收,方法区有什么东西?...kotlin的泛型了解吗?泛型的pecs原则 同步屏障 性能优化做过什么工作? RecyclerView的缓存结构是怎样的?缓存的是什么?cachedView会执行onBindView吗?...RecyclerView嵌套RecyclerView,NestScrollView嵌套ScrollView滑动冲突 ViewGroup在Action_Move时onIntercept返回true,事件怎么传递...最后我在这里分享一下这段时间从朋友,大佬那里收集到的一些2019-2020BAT 面试真题解析,里面内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、
领取专属 10元无门槛券
手把手带您无忧上云