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.
- Android Recyclerview lag mientras se desplaza hacia abajo
- Deshabilitar la paginación de ViewPager cuando el reciclador de niños se desplaza al último elemento
- ScrollView vs RecyclerView para niños diferentes en Android
- Cargando datos de forma eficaz en RecycleView
- SwipeRefreshLayout sin animación en la creación de fragmentos
Justo a tiempo, ya he configurado mi CardView (XML) con estos:
android:clickable="true" android:background="?android:selectableItemBackground"
¡Gracias!
- Arrastrar y soltar RecyclerView que se rellena desde SQLiteDatabase
- Android Studio 2.2.2 error "No se puede localizar el modo 0" en la visualización de renderizado después de la actualización
- Google Maps Lite Mode causa jank en RecyclerView
- RecyclerView Expandir / Contraer elementos
- ¿Agregar un nuevo elemento a recyclerview de forma programática?
- Cómo filtrar un RecyclerView con un SearchView
- Las animaciones de elementos predictivos de RecyclerView no funcionan (APPEARING)
- Barra de herramientas dejando espacio en blanco con ocultar en RecyclerView scroll
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"
- Android ICS: intento de error JNI para usar referencia local obsoleta 0x1
- Detectar error de vista Web y mostrar mensaje