Подтвердить что ты не робот

RecyclerView + обратная связь CardView + Touch

Кто-нибудь решил тайну CardView без сенсорной обратной связи, когда она находится внутри RecyclerView?

У меня есть RecyclerView с связкой CardViews (CardList). Когда я нажимаю на любой CardView, я запускаю другое действие. Это работает очень хорошо, но я не вижу никакой обратной связи при нажатии на CardView.

Как раз вовремя, я уже настроил свой CardView (XML) такими:

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

Спасибо!

4b9b3361

Ответ 1

Фон:

CardView игнорирует android:background в пользу app:cardBackground, который может быть только цветным. Граница и тень на самом деле являются частью фона, поэтому вы не можете установить свой собственный.

Решение:

Сделайте макет внутри CardView кликабельным, а не самой картой. Вы уже писали оба атрибута, необходимые для этого макета:

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

Ответ 2

Решение 1

Как предложил @Eugen, вы можете сделать макет внутри CardView clickable, поэтому вы можете использовать android:background:

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

Решение 2

Если вы не хотите потерять элемент прослушивания элемента, создав макет внутри CardView clickable, вы можете использовать android:foreground:

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

Дополнительно: вы можете использовать "?attr/selectableItemBackgroundBorderless" вместо "?attr/selectableItemBackground", если вам не нужна маска прямоугольника.

Ответ 3

создать селектор "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>

вы можете просмотреть оригинальное сообщение здесь

Ответ 4

Оба подхода должны работать одинаково.

1) Если вы хотите, чтобы cardview отвечал на сенсорную обратную связь, используйте этот параметр в карте > .

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

но если вышеприведенный подход не работает, вы можете установить это свойство в группе просмотра дочерний (линейный/относительный и т.д.) cardview.

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

Но тогда itemView ViewHolder не будет реагировать на событие touch. поскольку он был потреблен по детскому виду, поэтому вам нужно установить clicklistener в childview для дальнейшей работы с прослушивателем в адаптере recycliewiew, таким образом, мы можем включить touch, а также щелкнуть события на элементах строки recyclerview в нашем адаптере.

если у вас есть трудное время после нажатия и нажмите на представления в кард-карте с пульсацией, это может быть полезно. Обратная связь с проблемой

2.). Второй подход заключается в использовании традиционного способа использования настраиваемого сенсорного селектора и его установки в качестве фона.

    <?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>

Docs Ripple Drawable

Ответ 5

Добавить атрибут foreground:

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