Retroalimentación de RecyclerView + CardView + Touch

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

Tengo un RecyclerView con un montón de CardViews (un CardList ). Cuando hago clic en cualquier CardView, comienzo otra Actividad. Eso está funcionando bastante bien, pero no puedo ver ninguna información de contacto cuando hago clic en el CardView.

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

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

¡Gracias!

Fondo:

El CardView ignora el android:background a favor de la app:cardBackground que sólo puede ser de color. La frontera y la sombra son de hecho parte del fondo así que usted no puede fijar sus los propios.

Solución:

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

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

Solución 1

Como @Eugen propuso, puede hacer que el diseño dentro de CardView clic, por lo que puede utilizar android:background :

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

Solución 2

Si no desea perder el elemento de escucha de clic haciendo clic en el diseño dentro de CardView , puede utilizar android:foreground :

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

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

Create 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 crear "drawable / card_foreground.xml" ( tendrá que ajustar los valores de inserción de acuerdo a 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"/> 

Modificar su elemento (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> 

Puede ver post original aquí

Ambos enfoques deben funcionar de la misma manera.

1) Si usted quiere que cardview responda a la regeneración del tacto entonces utilice éste en cardview .

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

Pero si el acercamiento anterior no está trabajando entonces usted puede fijar esta característica en el grupo de la visión del niño (lineal / relativo etc) de cardview .

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

Pero entonces itemView de ViewHolder no responderá al evento táctil . Ya que ha sido consumido por la vista de niño por lo que tiene que establecer clicklistener en childview para trabajar más con el oyente en el adaptador recyclerview, de esta manera podemos activar el toque, así como eventos de clic en los elementos de la fila de recyclerview en nuestro adaptador.

Si tiene dificultades para seguir el tacto y haga clic en vistas en cardview con ondulación, entonces esto podría ser útil. Problema de respuesta al tacto

2.) El segundo enfoque es utilizar la forma tradicional de usar el selector de tacto 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

Añadir atributo de foreground :

 android:foreground="?android:attr/selectableItemBackground" 
  • FindFirstVisibleItemPositions no funciona para recycleview android
  • No contraer la barra de herramientas cuando RecyclerView se ajusta a la pantalla
  • LayoutManager para RecyclerView Grid con diferente ancho de celda
  • SwipeRefreshLayout está oculto en vacío RecyclerView
  • RecyclerView dentro de ScrollView / NestedScrollView no se desplaza correctamente
  • Causa de NullPointerException android.support.v7.widget.RecyclerView.onMeasure
  • ¿Mostrar diferente viewType en RecyclerView basado en información en la base de datos?
  • RecyclerView dentro de ScrollView no funciona
  • RecyclerView onBindViewHolder sólo se llama cuando los cambios getItemViewType
  • RecyclerView con GridLayoutManager intentando resolver wrap_content
  • GetAdapterPosition () no devuelve la posición del elemento en RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.