对包含ImageView的RecyclerView项目产生连锁反应

时间:2015-02-20 19:04:00

标签: android android-recyclerview ripple

我有RecyclerView扩展了以下网格项:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginLeft="@dimen/children_tile_border"
    android:layout_marginTop="@dimen/children_tile_border"
    android:clickable="true"
    android:focusable="true"
    android:background="?selectableItemBackground"
    tools:ignore="RtlHardcoded">

        <com.example.app.ui.widget.SquareImageView
            android:id="@+id/child_picture"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:visibility="visible"
            android:layout_alignParentBottom="true"/>

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="68dp"
            android:background="@color/tile_text_background"
            android:gravity="center_vertical"
            android:layout_alignParentBottom="true">

            ..............
        </LinearLayout>
</RelativeLayout>

但是,除非我将SquareImageView's可见性设置为不可见,否则涟漪效应不会出现。似乎涟漪效应低于SquareImageView。我怎样才能将它绘制在SquareImageView上?

6 个答案:

答案 0 :(得分:66)

将以下代码添加到您的父版面

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

如果你想要自定义涟漪效果,请在你的drawable-v21中添加这个ripple_custom.xml

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

    <item
        android:id="@android:id/mask"
        android:drawable="@color/windowBackground" />
</ripple>

支持旧版本在drawable中添加ripple_custom.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="@color/colorHighlight" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</selector>

答案 1 :(得分:12)

变化:

android:background="?selectableItemBackground"

要:

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

并将其添加到SquareImageView

android:clickable="false" 

答案 2 :(得分:8)

我们可以在FrameLayout内包装RecyclerView Item并为其设置android:foreground属性。有关详细信息,请查看link之后的结帐它很适合我。

答案 3 :(得分:2)

如果您有CardView + ImageView
只需插入CardView

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

对于RelativeLayout + ImageView
插入RelativeLayout

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

或者

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

此代码对我有用

答案 4 :(得分:1)

您的SquareImageView填满了整个空间(widthmatch_parentheightwrap_content),因此SquareImageView收到了点击事件。

在我的案例中有用的是将RelativeLayout中所有对象的可点击状态设置为false:

android:clickable="false"

确保您的RelativeLayout处理活动中的点击事件。在我的代码中,我将RelativeLayout设置为view v并在其上设置onClick Listener以处理我的列表项中的CheckBox

v.setOnClickListener(this);

希望这有助于任何阅读它的人。

答案 5 :(得分:0)

以上答案正确。但我想推荐android:foreground的用法,因为它显示了imageView的波纹。

在您的根视图上,添加以下内容。

android:foreground="@drawable/ripple_effect_color_primary"
android:clickable="true"
android:focusable="true"

我知道对于这样的旧线程来说这是一个很晚的答案。但是谁知道呢,实际上有人会发现它有用。