Retour tactile avec RecyclerView et CardView

J’aimerais activer les commentaires tactiles pour ma bibliothèque Open-Source.

J’ai créé un RecyclerView et un CardView . CardView contient différentes zones avec différentes actions onClick . J’aimerais maintenant déclencher l’effet Ripple si un utilisateur clique n’importe où sur la carte, mais je ne parviens pas à réaliser ce comportement.

C’est mon listitem, vous pouvez le trouver aussi sur GitHub: https://github.com/mikepenz/AboutLibraries/blob/master/library/src/main/res/layout/listitem_opensource.xml

                

Et le onClick est défini sur 3 parties de cette mise en page. libraryCreator , libraryDescription et libraryBottomContainer .

J’espère que quelqu’un a une idée de ce qui ne va pas ici.

Merci de votre aide.

En supposant que vous utilisez le thème Material / Appcompat et Lollipop, cela fonctionne en faisant en sorte que CardView ait les atsortingbuts suivants:

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

CardLayout est juste une sous-classe de ViewGroup, paramètre So:

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

devrait faire le tour.

METTRE À JOUR:

(on dirait que vous essayez d’utiliser une couleur d’ondulation personnalisée.)

Essayez d’utiliser une ondulation pouvant être dessinée avec une couleur personnalisée comme arrière-plan (je ne l’ai pas utilisé, donc je ne peux pas vérifier ce comportement). Consultez la documentation ou cette question pour vous aider à démarrer.

pour moi:

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

a finalement fonctionné. voir l’arrière-plan de recyclerView / content derrière l’élément et voir également l’effet d’entraînement utilisé avec recyclerView.

Aucune des réponses ci-dessus ne fonctionnait pour moi ou n’était trop compliquée.

Ensuite, j’ai réalisé que je devais définir les propriétés suivantes dans THE LAYOUT RECYCLERVIEW ADAPTER.

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

Ensuite, je l’ai fait fonctionner.

J’étais maintenant capable de résoudre le problème.

Le problème est que j’utilise onClickListener sur les TextViews et que cet écouteur de clic empêche le RippleForeground d’être averti de l’événement tactile. La solution consiste donc à implémenter un TouchListener sur ces TextViews et à passer l’événement tactile.

La classe est très simple et peut être utilisée partout:

 package com.mikepenz.aboutlibraries.util; import android.support.v7.widget.CardView; import android.view.MotionEvent; import android.view.View; /** * Created by mikepenz on 16.04.15. */ public class RippleForegroundListener implements View.OnTouchListener { CardView cardView; public RippleForegroundListener setCardView(CardView cardView) { this.cardView = cardView; return this; } @Override public boolean onTouch(View v, MotionEvent event) { // Convert to card view coordinates. Assumes the host view is // a direct child and the card view is not scrollable. float x = event.getX() + v.getLeft(); float y = event.getY() + v.getTop(); if (android.os.Build.VERSION.SDK_INT >= 21) { // Simulate motion on the card view. cardView.drawableHotspotChanged(x, y); } // Simulate pressed state on the card view. switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: cardView.setPressed(true); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: cardView.setPressed(false); break; } // Pass all events through to the host view. return false; } } 

Il peut être utilisé en ajoutant ceci comme TouchListener:

 RippleForegroundListener rippleForegroundListener = new RippleForegroundListener(); older.libraryCreator.setOnTouchListener(rippleForegroundListener); 

Cet auditeur va simplement passer l’événement tactile à CardView et déclencher l’effet Ripple correct. (Vous pouvez également modifier cela pour prendre n’importe quelle vue. Il ne doit pas être limité à un CardView)

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

Si vous utilisez plutôt le premier plan que l’arrière-plan, vous n’avez pas besoin d’utiliser le cliquable ou le focusable.

Dans mon cas, je devais aussi montrer un arrière-plan et un effet d’entraînement personnalisés. La manière dont je suis parvenu à cette fin a été d’appliquer ces deux atsortingbuts à la disposition racine de mon élément de vue recycleur:

 android:background="@drawable/custom_bg" android:foreground="?android:attr/selectableItemBackground" 

Eu le même problème que Jiang:

Je dois définir les atsortingbuts du fichier de présentation, qui gonfle le RecycleView.

Ma mise en page principale: ( N’ajoutez pas les propriétés ici!)

     

Mon RecycleViewAdapter:

  View v = inflater.inflate(R.layout.list_center_item, parent, false); 

Mon list_center_item.xml ( Ajoutez les propriétés ici! )

   

Vous devez append les lignes suivantes dans la mise en page que vous utilisez sous CardView

 android:clickable="true" android:focusable="true" android:background="@drawable/my_ripple" 

Exemple