正确设置列表项的背景
Correctly setting the background of a list item
我使用 RecyclerView
和一个简单的项目布局,其中包含一个 ConstraintLayout
来保存每个项目的文本元素。我想设置所有项目的背景 while
- 点击时显示涟漪效果。
- 当视图处于 活动状态时可视化。
- 能够设置颜色。 (可选,如果确实需要的话)
最低SDK版本为21,如有需要,允许提高。
我尝试了什么:
- 使用
@android:drawable/list_selector_background
不可自定义且未显示波纹。
- 使用
?selectableItemBackground
或?selectableItemBackgroundBorderless
不起作用,它会在运行时抛出异常(Failed to resolve attribute [...]
)。我确实将设计支持库放在我的 gradle 脚本中,或者现在放在 com.google.android.material
包中。前置 android:attr/
产生了同样的错误。
- 使用
StateListDrawable
自己构建它,使用许多 <ripple>
Drawables 似乎过于复杂,因为我不想重现上述功能的全部功能。
linked by @Cheticamp combined with the approach in this article 工作正常:
项目的布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_item_background_active_handler">
<include
layout="@layout/the_actual_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground" />
</FrameLayout>
list_item_background_active_handler
看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/listBackgroundActive" android:state_activated="true" />
<!-- default -->
<item android:drawable="@android:color/transparent" />
</selector>
这允许使用自定义颜色处理活动状态。只需在适配器中 onBindViewHolder()
中的项目视图上调用 isActivated(true)
。
可以用自定义波纹效果的颜色。
我使用 RecyclerView
和一个简单的项目布局,其中包含一个 ConstraintLayout
来保存每个项目的文本元素。我想设置所有项目的背景 while
- 点击时显示涟漪效果。
- 当视图处于 活动状态时可视化。
- 能够设置颜色。 (可选,如果确实需要的话)
最低SDK版本为21,如有需要,允许提高。
我尝试了什么:
- 使用
@android:drawable/list_selector_background
不可自定义且未显示波纹。 - 使用
?selectableItemBackground
或?selectableItemBackgroundBorderless
不起作用,它会在运行时抛出异常(Failed to resolve attribute [...]
)。我确实将设计支持库放在我的 gradle 脚本中,或者现在放在com.google.android.material
包中。前置android:attr/
产生了同样的错误。 - 使用
StateListDrawable
自己构建它,使用许多<ripple>
Drawables 似乎过于复杂,因为我不想重现上述功能的全部功能。
项目的布局如下所示:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_item_background_active_handler">
<include
layout="@layout/the_actual_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?selectableItemBackground" />
</FrameLayout>
list_item_background_active_handler
看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/listBackgroundActive" android:state_activated="true" />
<!-- default -->
<item android:drawable="@android:color/transparent" />
</selector>
这允许使用自定义颜色处理活动状态。只需在适配器中 onBindViewHolder()
中的项目视图上调用 isActivated(true)
。
可以用