我可以使用 ViewBindings 来替换findViewById
这个典型的RecyclerView.Adapter
初始化代码吗?我无法binding
在对象中设置val,因为每个单元格的 ViewHolders 都不同。
class CardListAdapter(private val cards: LiveData<List<Card>>) : RecyclerView.Adapter<CardListAdapter.CardViewHolder>() {
class CardViewHolder(val cardView: View) : RecyclerView.ViewHolder(cardView)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
val binding = CardBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return CardViewHolder(binding.root)
}
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
val title = holder.cardView.findViewById<TextView>(R.id.title)
val description = holder.cardView.findViewById<TextView>(R.id.description)
val value = holder.cardView.findViewById<TextView>(R.id.value)
// ...
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在演示模式下显示项目选项卡(左侧文件导航)?
我知道我可以切换文件⌘E,但我想向观众展示整个文件结构.
我有一个屏幕,可以加载一堆请求并从同一屏幕上的用户和外部 WebView 收集一些数据。因此,我有一个包含这些复杂请求对象(+用户输入数据)的 ViewModel。我需要通过系统启动的进程死亡来持久保存这些数据,这SavedStateHandle
是设计的目的。但我不想将这些数据保留在数据库中,因为它只与当前的用户体验相关。
我已将我的 ViewModel 与 Hilt 集成并收到了SaveStateHandle
. 因为我有一些复杂的对象,可以在代码中的多个位置访问/修改它们,所以我无法“随时随地”保存它们。我让它们实现Parcelable
,只是想立即保存它们。不幸的是,ViewModel 没有像onSaveInstanceState()
.
现在,我尝试使用onCleared()
听起来像是写入句柄的好地方。但事实证明,.set()
我在那里执行的所有操作都会丢失(我正在使用开发人员选项“不保留活动”进行测试。当我.set()
在其他地方使用时,它确实有效)。因为 ViewModel 不依赖于单个片段/活动的生命周期,而是依赖于 NavGraph,所以我无法从它们的onSaveInstanceState()
.
我如何/在哪里可以正确地保留我的状态SaveStateHandle
?
我通常会遇到以下 IntelliJ 检查
private boolean bar() {
return foo().contains("foo"); // Method invocation 'contains' may produce 'java.lang.NullPointerException'
}
private String foo() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
检查对我来说似乎很好,但是 IntelliJ 建议的修复方法之一(通常是唯一的)是:
private boolean bar() {
return Objects.requireNonNull(foo()).contains("foo");
}
Run Code Online (Sandbox Code Playgroud)
然后警告消失了。但我根本不明白这有什么帮助?requireNonNull
只会抛出与NullPointerException
在.contains
上调用时无论如何都会抛出的相同null
。
通常,IntelliJ 会提出有意义的建议,这是一个常见的建议,所以我在这里错过了重点吗?
java intellij-idea nullpointerexception intellij-inspections
我正在按照 Google 文档中的建议设置 Fragment :
private var _binding: MyBinding? = null
private val binding get() = _binding!!
Run Code Online (Sandbox Code Playgroud)
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = MyBinding.inflate(inflater, container, false)
Run Code Online (Sandbox Code Playgroud)
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}
Run Code Online (Sandbox Code Playgroud)
现在我正在调用一个协程,据我所知,该协程应限定在此片段的生命周期内。它有一个更长的网络调用,然后成功:
lifecycleScope.launch(Dispatchers.Main) {
when (myViewModel.loadFromNetwork(url)) {
true -> responseSuccess()
false -> responseFailure()
}
}
Run Code Online (Sandbox Code Playgroud)
private suspend fun responseSuccess() {
binding.stateSuccess.visibility = View.VISIBLE
// ...
}
Run Code Online (Sandbox Code Playgroud)
现在,当我在loadFromNetwork
加载时按下 Android 系统后退按钮时,片段会被销毁并被onDestroyView()
调用。因此binding
现在是null
. 我得到一个 …
我有一个数字n
和一组S ? [1..n]*
大小的数字s
(大大小于n
).我想以k ? [1..n]
相同的概率对数字进行采样,但不允许该数字在集合中S
.
我试图在最坏的情况下解决问题O(log n + s)
.我不确定是否可能.
一种天真的方法是创建一个从1到n的数字数组,不包括所有数字S
,然后选择一个数组元素.这将运行,O(n)
不是一个选项.
另一种方法可能只是生成随机数?[1..n]
,如果包含它们则拒绝它们S
.这没有理论上的约束,因为任何数字都可以被多次采样,即使它在集合中也是如此.但平均而言,这可能是一个实际的解决方案,如果s
大大小于n
.
我按照此处和此处的Kotlin 文档选择加入kotlin.ExperimentalUnsignedTypes
整个模块。我的模块build.gradle
现在看起来像这样:
android {
...
kotlinOptions {
jvmTarget = "1.8"
freeCompilerArgs += "-Xopt-in=kotlin.ExperimentalUnsignedTypes"
}
Run Code Online (Sandbox Code Playgroud)
Lint 仍在抱怨 ExperimentalUnsignedTypes,编译时我收到此警告:
> Task :myModule:compileDebugKotlin
w: Flag is not supported by this version of the compiler: -Xopt-in=kotlin.ExperimentalUnsignedTypes
Run Code Online (Sandbox Code Playgroud)
我的科特林版本是:1.3.61
我有一个需要方法引用的方法:
expectsMethodRef(obj::someMethod);
Run Code Online (Sandbox Code Playgroud)
我现在只在编译时通过反射检索方法。如何从 Method 对象获取方法引用?
Method method = obj.class.getMethod(methodNameStr);
expectsMethodRef(<how to input my method here?>);
Run Code Online (Sandbox Code Playgroud)