RippleDrawable无法在RecyclerView中显示正确的状态

问题描述

我有一个rippledrawable,状态不同,用于选择RecyclerView中的列表项

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/PrimaryBlue">
    <item android:id="@android:id/mask">
        <color android:color="@android:color/white" />
    </item>

    <item>
        <selector>
            <item android:state_activated="true">
                <color android:color="@color/HeaderBackgroundGrey"/>
            </item>
            <item android:state_focused="true">
                <color android:color="@color/HeaderBackgroundGrey"/>
            </item>
            <item android:state_active="true">
                <color android:color="@android:color/transparent"/>
            </item>
            <item android:state_selected="true">
                <color android:color="@android:color/transparent"/>
            </item>
            <item android:state_enabled="true">
                <color android:color="@android:color/transparent"/>
            </item>
            <item android:state_checked="true">
                <color android:color="@android:color/transparent"/>
            </item>
            <item android:state_pressed="true">
                <color android:color="@android:color/transparent"/>
            </item>
        </selector>
    </item>
</ripple>

最初,当列表加载时,列表中的第一项是@color/PrimaryBlue颜色,但它应该是我的激活颜色,因此蓝色似乎会覆盖激活的颜色

当我在列表中选择一个项目时,我想将背景更改为深灰色,并通过在onBindViewHolder中将视图状态设置为激活来做到这一点

holder.menu_item.isActivated = selectedPosition == position

这会将行更改为背景颜色,但列表中的第一项是我的@color/PrimaryBlue颜色。我不知道该项目处于什么状态,因为我认为它将是聚焦状态,但是我尝试在选择器中进行设置,但仍然是蓝色。

正如您在此处看到的那样,“ Etherenet”仍然是蓝色,而“ display”是使用正确背景选择的内容。但是,以太网现在应该与“ Wifi”具有相同的颜色

enter image description here

我可以将蓝色从列表中的第一项移到的唯一方法是,如果我请求将焦点移至另一个视图,但是蓝色仅移至我关注的另一个列表项。

我希望当使用鼠标或通过键盘导航将行悬停在一行上时,蓝色突出显示,然后在选择该项目时,该行应显示该行的激活状态颜色,而所有其他行应为认状态背景颜色。

这是我该行项目的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/menu_item"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:background="@drawable/selected_background"
    android:focusable="true">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/text_margin"/>

</LinearLayout>

如何删除/更改第一个列表项的状态,使其不为蓝色,甚至是在回收器视图中显示所选列表项的正确方法,同时保持其他状态通过鼠标和键盘正常工作

更新

如果我将Drawable更改为此

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@android:color/transparent">
    <item android:id="@android:id/mask">
        <color android:color="@android:color/white" />
    </item>

    <item>
        <selector>
            <item android:state_activated="true">
                <color android:color="@color/HeaderBackgroundGrey"/>
            </item>
            <item android:state_focused="true">
                <color android:color="@color/ListItemBlue"/>
            </item>
            <item android:state_hovered="true">
                <color android:color="@color/ListItemBlue"/>
            </item>
            <item android:state_drag_hovered="true">
                <color android:color="@color/ListItemBlue"/>
            </item>
        </selector>
    </item>
</ripple>

Adapter onBind

override fun onBindViewHolder(holder: ViewHolder,position: Int) {
            val item = values[position]
            holder.title.text = item

            if (lastPosition == position) {
                holder.menu_item.isActivated = true
                holder.menu_item.requestFocus()
            } else {
                holder.menu_item.isActivated = false
            }
        }

我得到了想要的东西,但是因为我将波纹设置为透明,所以单击时不会得到波纹动画

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)