RecyclerView + обратная связь CardView + Touch
Кто-нибудь решил тайну CardView без сенсорной обратной связи, когда она находится внутри RecyclerView?
У меня есть RecyclerView с связкой CardViews (CardList). Когда я нажимаю на любой CardView, я запускаю другое действие. Это работает очень хорошо, но я не вижу никакой обратной связи при нажатии на CardView.
Как раз вовремя, я уже настроил свой CardView (XML) такими:
android:clickable="true"
android:background="?android:selectableItemBackground"
Спасибо!
Ответы
Ответ 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"