正确设置列表项的背景

时间:2018-10-12 16:31:24

标签: android android-recyclerview listitem rippledrawable

我使用RecyclerView和一个简单的项目布局,该布局由ConstraintLayout组成,其中包含每个项目的文本元素。我想同时设置所有项目的背景

  1. 单击时显示涟漪效果。
  2. 在视图处于活动状态时可视化。
  3. 能够设置颜色。 (可选,如果确实需要的话)

SDK的最低版本为21,如有需要,可以提高它。


我尝试过的事情:

  • 使用@android:drawable/list_selector_background不可自定义,也不会引起涟漪。
  • 使用?selectableItemBackground?selectableItemBackgroundBorderless不起作用,它将在运行时引发异常(Failed to resolve attribute [...])。我确实将设计支持库放置在我的gradle脚本中,或者现在放置在com.google.android.material包中。前置android:attr/会产生相同的错误。
  • 由于我不想复制上述功能的全部功能,因此使用StateListDrawable自己使用许多<ripple>的可绘制对象来构建所有对象似乎过于复杂。

1 个答案:

答案 0 :(得分:0)

This answer链接的

@Cheticampthis 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>

这允许使用自定义颜色处理活动状态。只需在适配器中isActivated(true)中某个项目的视图上调用onBindViewHolder()

波纹效果的颜色可以用this approach自定义。