小编A1m*_*A1m的帖子

如何在 RecyclerView.Adapter 中使用 ViewBinding?

我可以使用 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)

android android-viewbinding

65
推荐指数
5
解决办法
3万
查看次数

在演示模式下的项目视图/文件导航

有没有办法在演示模式下显示项目选项卡(左侧文件导航)?

我知道我可以切换文件E,但我想向观众展示整个文件结构.

intellij-idea

6
推荐指数
1
解决办法
872
查看次数

如何延迟保存ViewModel的SavedStateHandle?

我有一个屏幕,可以加载一堆请求并从同一屏幕上的用户和外部 WebView 收集一些数据。因此,我有一个包含这些复杂请求对象(+用户输入数据)的 ViewModel。我需要通过系统启动的进程死亡来持久保存这些数据,这SavedStateHandle是设计的目的。但我不想将这些数据保留在数据库中,因为它只与当前的用户体验相关。

我已将我的 ViewModel 与 Hilt 集成并收到了SaveStateHandle. 因为我有一些复杂的对象,可以在代码中的多个位置访问/修改它们,所以我无法“随时随地”保存它们。我让它们实现Parcelable,只是想立即保存它们。不幸的是,ViewModel 没有像onSaveInstanceState().

现在,我尝试使用onCleared()听起来像是写入句柄的好地方。但事实证明,.set()我在那里执行的所有操作都会丢失(我正在使用开发人员选项“不保留活动”进行测试。当我.set()在其他地方使用时,它确实有效)。因为 ViewModel 不依赖于单个片段/活动的生命周期,而是依赖于 NavGraph,所以我无法从它们的onSaveInstanceState().

我如何/在哪里可以正确地保留我的状态SaveStateHandle

android viewmodel android-savedstate viewmodel-savedstate

6
推荐指数
1
解决办法
3418
查看次数

IntelliJ 检查:“方法调用可能会产生 NullPointerException”。建议的修复是否有意义?

我通常会遇到以下 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

5
推荐指数
1
解决办法
2438
查看次数

Fragment 中的视图绑定导致 KotlinNullPointerException 在生命周期范围内的协程中运行

我正在按照 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. 我得到一个 …

android kotlin kotlin-coroutines android-viewbinding

5
推荐指数
1
解决办法
486
查看次数

具有相等概率的样本编号,不是集合的一部分

我有一个数字n和一组S ? [1..n]*大小的数字s(大大小于n).我想以k ? [1..n]相同的概率对数字进行采样,但不允许该数字在集合中S.

我试图在最坏的情况下解决问题O(log n + s).我不确定是否可能.

一种天真的方法是创建一个从1到n的数字数组,不包括所有数字S,然后选择一个数组元素.这将运行,O(n)不是一个选项.

另一种方法可能只是生成随机数?[1..n],如果包含它们则拒绝它们S.这没有理论上的约束,因为任何数字都可以被多次采样,即使它在集合中也是如此.但平均而言,这可能是一个实际的解决方案,如果s大大小于n.

algorithm probability

4
推荐指数
1
解决办法
111
查看次数

Kotlin 选择加入:此版本的编译器不支持标志

我按照此处此处的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

android kotlin

4
推荐指数
1
解决办法
5788
查看次数

从 Method 对象获取 Method 引用

我有一个需要方法引用的方法:

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)

java java-8

0
推荐指数
1
解决办法
582
查看次数