RecyclerView + CardView +触摸反馈

时间:2015-01-04 00:06:40

标签: android touch android-5.0-lollipop android-recyclerview android-cardview

RecyclerView 中有没有人解决 CardView 之谜而没有触摸反馈?

我有一堆带有一系列CardView的RecyclerView( CardList )。当我点击任何CardView时,我开始另一个活动。这工作得很好,但是当我点击CardView时,我看不到任何触摸反馈。

及时,我已经使用以下内容配置了我的CardView(XML):

android:clickable="true"
android:background="?android:selectableItemBackground"

谢谢!

5 个答案:

答案 0 :(得分:37)

<强>背景

CardView忽略android:background支持app:cardBackground,而CardView只能是彩色。边框和阴影实际上是背景的一部分,所以你不能自己设置。

<强>解决方案:

使android:clickable="true" android:background="?android:selectableItemBackground" 可点击内的布局而不是卡片本身。您已经编写了此布局所需的两个属性:

{{1}}

答案 1 :(得分:7)

解决方案1 ​​

正如@Eugen建议的那样,您可以使CardView内的布局可以点击,这样您就可以使用android:background

<android.support.v7.widget.CardView
    ...
    android:clickable="true"
    android:background="?attr/selectableItemBackground">

解决方案2

如果您不希望通过点击CardView内的布局来丢失项目点击监听器,则可以使用android:foreground

<android.support.v7.widget.CardView
    ...
    android:clickable="true"
    android:foreground="?attr/selectableItemBackground">

额外:如果您不想要矩形蒙版,则可以使用"?attr/selectableItemBackgroundBorderless"代替"?attr/selectableItemBackground"

答案 2 :(得分:1)

创建选择器“drawable / card_foreground_selector”

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#18000000"/>
            <corners android:radius="@dimen/card_radius" />
        </shape>
    </item>
    <item android:state_focused="true" android:state_enabled="true">
        <shape android:shape="rectangle">
            <solid android:color="#0f000000"/>
            <corners android:radius="@dimen/card_radius" />
        </shape>
    </item>
</selector>

并创建“drawable / card_foreground.xml”( 您需要根据卡片的高度调整插入值

<inset xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/card_foreground_selector"
android:insetLeft="2dp"
android:insetRight="2dp"
android:insetTop="3dp"
android:insetBottom="3dp"/>

修改你的项目(item.xml)

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:contentPadding="8dp"
    android:foreground="@drawable/card_foreground">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    // ..

    </LinearLayout>
</android.support.v7.widget.CardView>

您可以查看原始帖子here

答案 3 :(得分:1)

添加foreground属性:

android:foreground="?android:attr/selectableItemBackground"

答案 4 :(得分:1)

两种方法都应该以同样的方式运作。

1) 如果您希望cardview响应触摸反馈,请在 cardview 中使用此功能。

 android:foreground="?android:attr/selectableItemBackground"
        android:clickable="true"
        android:focusable="true"

但如果上述方法无效,则可以在 cardview 视图组(线性/相对等)中设置此属性。

   android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"

但ViewHolder的itemView将无法响应 触摸 事件。由于子视图已经 消费 ,因此您必须在子视图上设置 clicklistener 以进一步处理侦听器recyclerview适配器,通过这种方式,我们可以在适配器中的recyclerview行项目上启用触摸和点击事件。

如果您很难按下触摸并点击带有纹波的cardview中的视图,那么这可能会有所帮助。 Touch Feedback Problem

2。) 第二种方法是使用传统方式使用自定义触摸选择器drawable并设置为背景。

    <?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="your ripple color">
    <item>
    <selector>
        <item android:state_selected="true">
            <color android:color="your selected color" />
        </item>
        <item android:state_activated="true">
            <color android:color="your selected color" />
        </item>
        <item>
            <color android:color="your normal color" />
        </item>
    </selector>
    </item>
</ripple>

文档Ripple Drawable