【问题标题】:Set alpha on RecyclerView but not selected child (Kotlin)在 RecyclerView 上设置 alpha 但未选择子级 (Kotlin)
【发布时间】:2023-03-11 14:20:01
【问题描述】:

我正在寻找一种方法来设置 RecyclerView 的所有元素的 alpha 而无需遍历元素。

基本上我可以设置整个回收器的 alpha,所有子级都将继承该 alpha,但是当我更新所选子级的 alpha 时,它仍然从其父级继承值,而不是更新自己的 alpha 值。所有这些都必须在单击具有以下 clickListener 的项目时发生。

// it is the view on which the listener is called that belongs to the recycler
private val click = View.OnClickListener {
   recycler.alpha = 0.2f
   it.alpha = 1f
}

我检查了该项目是否被正确选择并且 clickListener 被调用。问题似乎是 alpha 是从父 ViewGroup 继承的,但在 official docs 中,我找不到任何关于无法更改子 view 中继承的 alpha 值的信息。

我错过了什么?如果设置父 ViewGroup 的 alpha 是不行的,有没有办法避免遍历所有元素并为每个元素设置 alpha 值?

【问题讨论】:

    标签: android kotlin android-recyclerview alpha


    【解决方案1】:

    它不是继承的 - 子代被绘制为父代的部分。因此,由于整个父级都具有该 alpha,因此子级是使用该 alpha 绘制的。将孩子的 alpha 设置为 0.2f 将使该孩子变得更加更加透明。

    您最好的选择可能是在您的 RecyclerView.Adapter 子类的 onBindViewHolder 方法中正确设置 alpha,并通过更改支持数据和 notify... 方法来更改 alpha。尝试在适配器之外更改 RecyclerView 子视图是自找麻烦,因为 RecyclerView 不会知道它们,并且可能会更改您的内容、添加更多视图等。

    【讨论】:

    • “它不是继承的 - 子元素被绘制为父元素的一部分。”这是为什么?我天真地认为 alpha 将是一种继承属性“CSS”样式。问题是我想避免将 alpha 保存在我的数据和 notify... 中,因为这需要遍历所有未选择的项目来更新它们。猜猜在这种情况下最好的方法是让视图观察一个持有所选项目的属性,并根据它们是否被选中(没有多个项目选择)来呈现自己。
    • “为什么?”这就是 Android 视图的工作方式。使用所选项目观察属性可能会起作用,只要您注意保持最新的位置(请记住,如果视图在数据集中的位置发生变化,则可能不会重新绑定)。
    • 最后,我使用实时数据做了类似于Update recycler view content without refreshing the data 中解释的事情。对我来说,这比getChangePayload(int oldItemPosition, int newItemPosition) 简单得多
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2010-11-04
    • 2021-06-17
    相关资源
    最近更新 更多