J'essaie d'ajouter Ripple Effect à l'article de RecyclerView. J'ai regardé en ligne, mais je n'ai pas trouvé ce dont j'avais besoin. Je suppose que cela doit être un effet personnalisé. J'ai essayé Android: attribut d'arrière-plan à RecyclerView lui-même et réglez-le sur "? Android: selectableItemBackground", mais cela n'a pas fonctionné.:
<Android.support.v7.widget.RecyclerView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:focusable="true"
Android:clickable="true"
Android:background="?android:selectableItemBackground"
Android:id="@+id/recyclerView"
Android:layout_below="@+id/tool_bar"/>
C'est le RecyclerView que j'essaye d'ajouter l'effet à:
J'ai réalisé. La seule chose à faire est d'ajouter cet attribut:
Android:background="?android:attr/selectableItemBackground"
à l'élément racine de la présentation que mon adaptateur RecyclerView gonfle comme ceci:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:paddingTop="8dp"
Android:paddingBottom="8dp"
Android:background="?android:attr/selectableItemBackground"
tools:background="@drawable/bg_gradient">
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="17sp"
Android:layout_marginLeft="15dp"
Android:layout_marginStart="15dp"
Android:id="@+id/shoppingListItem"
Android:hint="@string/enter_item_hint"
Android:layout_centerVertical="true"
Android:layout_alignParentLeft="true"
Android:layout_alignParentStart="true"/>
<CheckBox
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:text="@string/shopping_list_item_checkbox_label"
Android:id="@+id/shoppingListCheckBox"
Android:layout_centerVertical="true"
Android:layout_marginRight="15dp"
Android:layout_alignParentRight="true"
Android:layout_alignParentEnd="true"
Android:checked="false"/>
</RelativeLayout>
Résultat:
Comme déjà répondu, la solution la plus simple consiste à ajouter l’un des éléments suivants au fond de votre ligne RecyclerView
:
Android:background="?android:attr/selectableItemBackground"
Android:background="?attr/selectableItemBackground"
Toutefois, si vous rencontrez problèmes avec cette méthode ou si vous souhaitez un contrôle plus précis des couleurs, vous pouvez procéder comme suit.
Cette réponse commence par this simple Android Exemple de RecyclerView . Cela ressemblera à l'image suivante.
Avant API 21 (Android 5.0 Lollipop), un clic sur un élément RecyclerView
venait de changer sa couleur d’arrière-plan (aucun effet d’ondulation). C'est ce que nous allons faire aussi. Si vous avez encore des utilisateurs avec ces appareils, ils sont habitués à ce comportement, nous ne nous en inquiétons donc pas trop. (Bien sûr, si vous voulez vraiment l'effet d'entraînement pour eux aussi, vous pouvez utiliser une bibliothèque personnalisée .)
Faites un clic droit sur votre res/drawable
dossier et choisissez Nouveau> Fichier de ressources pouvant être dessiné . Appeler custom_ripple
. Cliquez sur OK et collez le code suivant.
custom_ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true">
<shape Android:shape="rectangle">
<solid Android:color="@color/colorAccent" />
</shape>
</item>
<item>
<shape Android:shape="rectangle">
<solid Android:color="@Android:color/transparent" />
</shape>
</item>
</selector>
J'ai utilisé colorAccent
comme couleur de surbrillance pour l'état pressé car il était déjà disponible, mais vous pouvez définir la couleur de votre choix.
Faites un clic droit sur votre res/drawable
dossier et choisissez Nouveau> Fichier de ressources pouvant être dessiné . Appeler custom_ripple
encore. Ne cliquez pas sur OK, mais cette fois encore. Dans la liste des qualificateurs disponibles , choisissez Version , puis cliquez sur le bouton >> et écrivez 21
pour le niveau de l’API de la plate-forme . Maintenant, cliquez sur OK et collez le code suivant.
v21/custom_ripple.xml
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:color="@color/colorAccent">
<item
Android:id="@Android:id/mask"
Android:drawable="@Android:color/white" />
</ripple>
Encore une fois, j’ai utilisé colorAccent
pour la couleur d’ondulation car elle était disponible, mais vous pouvez utiliser la couleur de votre choix. Le masque limite l’effet d’ondulation à la disposition des lignes. La couleur du masque apparemment peu importe alors je viens d'utiliser un blanc opaque.
Dans la disposition racine de votre élément RecyclerView, définissez l'arrière-plan sur l'ondulation personnalisée que nous avons créée.
Android:background="@drawable/custom_ripple"
Dans le exemple de projet avec lequel nous avons commencé, cela ressemble à ceci:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:background="@drawable/custom_ripple"
Android:padding="10dp">
<TextView
Android:id="@+id/tvAnimalName"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="20sp"/>
</LinearLayout>
C'est ça. Vous devriez pouvoir exécuter votre projet maintenant. Merci à cette réponse et cette vidéo YouTube à l’aide.
Je pense qu'il y a un petit détail qui manque.
Si vous n'obtenez toujours pas l'effet d'entraînement après avoir ajouté Android:background="?android:attr/selectableItemBackground"
essayez d’ajouter les lignes suivantes à la racine de la présentation.
Android:clickable="true"
Android:focusable="true"
Cela garantira que la vue est cliquable et activera l'effet d'entraînement avec l'attribut background mentionné ci-dessus.