Android RippleDrawable在RecyclerView中未显示正确的状态
我有一个具有不同状态的Android RippleDrawable在RecyclerView中未显示正确的状态,android,android-recyclerview,rippledrawable,Android,Android Recyclerview,Rippledrawable,我有一个具有不同状态的RippleDrawable,用于在RecyclerView <?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/PrimaryBlue"> <it
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
color。我不知道该项目处于什么状态,因为我认为它将是聚焦状态,但我尝试在选择器中设置它,但它仍然是蓝色的
正如您在这里看到的,“Ethernet”仍然是蓝色,“Display”是用正确的背景选择的。然而,以太网现在应该与“Wifi”的颜色相同
我可以将蓝色从列表中的第一个项目移动的唯一方法是,如果我请求将焦点移动到另一个视图,但蓝色只是移动到我指定焦点的另一个列表项目
我希望在使用鼠标或键盘导航某一行时,蓝色高亮显示该行,然后在选中该项目时,它应显示该行的激活状态颜色,所有其他行应为默认背景色
这是我的行项目布局
<?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>
我得到了我想要的,但因为我将涟漪设置为透明,所以单击时无法获得涟漪动画为什么要手动设置激活的涟漪?另外,请粘贴您的适配器代码,以明确您是如何调用/设置的。@Elliptica是的,我将其设置为Activated我没有遇到在实现上述代码时遇到的问题,因此我希望确保我们的代码完全匹配。您能否粘贴完整的适配器,以及在布局中创建回收器的位置,并将其填写到mainActivity中,等等?(另外,我的问题是,为什么要手动设置它--它应该自行设置。您是在遇到共享的问题后还是之前开始手动激活/聚焦它?)@Elliptica哦,对不起,我误读了你的第一个问题,如果你不手动设置视图,该视图将如何激活?我从未见过一行自动激活。这就是说,我在模拟器上而不是在我的设备上尝试了它,看起来这可能是一个特定于设备的问题,因为它在模拟器上没有显示此行为。为什么要手动设置激活的?另外,请粘贴您的适配器代码,以明确您是如何调用/设置的。@Elliptica是的,我将其设置为Activated我没有遇到在实现上述代码时遇到的问题,因此我希望确保我们的代码完全匹配。您能否粘贴完整的适配器,以及在布局中创建回收器的位置,并将其填写到mainActivity中,等等?(另外,我的问题是,为什么要手动设置它--它应该自行设置。您是在遇到共享的问题后还是之前开始手动激活/聚焦它?)@Elliptica哦,对不起,我误读了你的第一个问题,如果你不手动设置视图,该视图将如何激活?我从未见过一行自动激活。也就是说,我在模拟器上而不是在我的设备上尝试了它,看起来这可能是一个特定于设备的问题,因为它在模拟器上没有显示这种行为
<?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>
<?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>
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
}
}