Android Weekly Issue #405
Glide'ing your way into RecyclerView state invalidation
在RecyclerView中显示list, 图像item, 点击查看大图.
但是无法保存位置?
保存位置是可以自动的额, 只要确保:
- RecyclerView有id.
- Adapter中的数据在第一次layout之前就有了.
解决方案: 缓存数据.
但是问题似乎还是没有解决, 为什么呢? -> 初始状态确实是保存并恢复了, 但是之后又被invalidated了.
线索: RecyclerView的尺寸被child决定时.
Glide缓存图片时用的是原始尺寸. 在把图片放进ImageView里时会做计算. 但是xml里面写的wrap_content, 所以Glide会对每个图片进行计算, 而在此时RecyclerView可能先做完了尺寸计算, image默认高度为0, 直到后来被加入图像.
尺寸计算影响了可见item的计算, 从而让RecyclerView重置了状态, 影响了状态恢复.
解决方法:
- 在xml里写死高度.
- Glide设定
override(Target.SIZE_ORIGINAL, 200)
. - 用一个placeholder.
Handling Nullability in Android 11 and Beyond
Android 11的preview:
https://developer.android.com/preview
给API加了更多的注解:
@RecentlyNullable
and @RecentlyNonNull
to @Nullable
and @NonNull
.
前两个是warnings, 后两个是errors.
8 Valid Reasons for Modularization in Android
模块化的8个好处.
Improving App Debugging With Flipper
Facebook开发的stetho的后代: Flipper: https://fbflipper.com/
比起Stetho的优势: 增加了API, 支持各种自定义扩展.
Combining Kotlin Flows with Select Expressions
多个Flow怎么结合? 有多种操作符可以选择.
实验特性: select expression
Coroutines: First things first
协程的取消和异常.
Collections in Kotlin
Kotlin集合.
Easy Android Scopes
保持对象的几种方法:
- Activity的
onRetainNonConfigurationInstance()
中返回现有的presenter. - Fragment的
setRetainInstance()
. - AndroidX ViewModel.
- scoped delegate: 一种代理的方式, 把viewmodel又包了一下. 这样更灵活, 可以绑定任何类型的对象.
Smart Casts via Assertions + Kotlin Contracts
新学了一个词: Rubber duck debugging.
这段代码:
fun main() {
val str: String? = “”
str.assertNotNull()
println(“string length = ${str.length}”) // will not compile
}
其中assert那句并不能让后面的语句默认变量已经不为null了.
需要用到Kotlin的Contracts(还是实验阶段):
@UseExperimental(ExperimentalContracts::class)
fun String?.assertNotNull() {
contract {
returns() implies (this@assertNotNull != null)
}
if (this == null){
throw AssertionError()
}
}
Preventing coroutine cancellation for important actions
协程还可以阻止取消: NonCancellable
.
Scripting file templates for Android Studio
创建文件模板: https://medium.com/codequest/file-group-templates-in-android-studio-unofficial-guide-85dfa0a0c1ec
本文分享的脚本, 把文件模板拷贝到repo里.
Modern User Storage on Android
Android 10和11的文件存储.
Codes
arkivanov/MVIKotlin
MVI framework.
Videos
Google Design Tutorials
设计课程, youtube playlist.
网友评论