android touch android-5.0-lollipop android-recyclerview android-cardview

android - RecyclerView+CardView+Touch comentarios



android-5.0-lollipop android-recyclerview (5)

Solución 1

Como propuso @Eugen, puedes hacer que se pueda hacer clic en el diseño dentro de CardView , y luego puedes usar android:background :

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

Solucion 2

Si no desea perder el elemento, haga clic en el oyente al hacer clic en el diseño dentro de CardView , puede usar android:foreground :

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

Extra : puede usar "?attr/selectableItemBackgroundBorderless" lugar de "?attr/selectableItemBackground" si no desea la máscara de rectángulo.

¿Alguien ha resuelto el misterio de CardView sin retroalimentación táctil cuando está dentro de un RecyclerView ?

Tengo un RecyclerView con un montón de vistas de tarjeta (una lista de tarjetas ). Cuando hago clic en cualquier CardView, comienzo otra actividad. Está funcionando bastante bien, pero no puedo ver ningún comentario táctil cuando hago clic en CardView.

Justo a tiempo, ya he configurado mi CardView (XML) con estos:

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

¡Gracias!


Añadir atributo de foreground :

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


Ambos enfoques deberían funcionar de la misma manera.

1) Si desea que Cardview responda a los comentarios táctiles, use esta en Cardview .

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

pero si el enfoque anterior no funciona, puede configurar esta propiedad en el grupo de vistas secundarias (Lineal / Relativo, etc.) de cardview .

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

Pero entonces itemView of ViewHolder no responderá al evento táctil . ya que ha sido consumido por la vista secundaria, por lo que tiene que configurar clicklistener en childview para seguir trabajando con el oyente en el adaptador de recyclerview, de esta manera podemos habilitar tanto el toque como los eventos en la fila de recyclerview en nuestro adaptador.

Si tiene dificultades para seguir el toque y haga clic en las vistas en cardview con ripple, esto podría ser útil. Touch Feedback Problem

2.) El segundo enfoque es utilizar la forma tradicional de usar el selector táctil personalizado dibujable y establecer como fondo.

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


crear selector "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>

y cree "drawable / card_foreground.xml" ( deberá modificar los valores de inserción según la elevación de su tarjeta )

<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"/>

modifica tu artículo (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>

Puedes ver la publicación original here


Fondo:

CardView ignora android:background a favor de app:cardBackground que solo puede ser color. El borde y la sombra son, de hecho, parte del fondo, por lo que no puede configurar el suyo propio.

Solución:

Haga que el diseño dentro de CardView hacer clic en lugar de la propia tarjeta. Ya escribiste los dos atributos necesarios para este diseño:

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