J'essaye d'utiliser un RecyclerView
comme horizontal ListView
. J'essaie de comprendre comment mettre en évidence l'élément sélectionné. Lorsque je clique sur l'un des éléments, il est sélectionné et il est correctement mis en évidence, mais lorsque je clique sur un autre, le second est mis en évidence avec l'ancien.
Voici ma fonction onClick:
@Override
public void onClick(View view) {
if(selectedListItem!=null){
Log.d(TAG, "selectedListItem " + getPosition() + " " + item);
selectedListItem.setBackgroundColor(Color.RED);
}
Log.d(TAG, "onClick " + getPosition() + " " + item);
viewHolderListener.onIndexChanged(getPosition());
selectedPosition = getPosition();
view.setBackgroundColor(Color.CYAN);
selectedListItem = view;
}
Voici le onBindViewHolder
:
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.setItem(fruitsData[position]);
if(selectedPosition == position)
viewHolder.itemView.setBackgroundColor(Color.CYAN);
else
viewHolder.itemView.setBackgroundColor(Color.RED);
}
android
android-recyclerview
recycler-adapter
utilisateur65721
la source
la source
Réponses:
J'ai écrit une classe d'adaptateur de base pour gérer automatiquement la sélection d'éléments avec un RecyclerView. Dérivez simplement votre adaptateur et utilisez des listes d'états dessinables avec state_selected, comme vous le feriez avec une vue de liste.
J'ai un article de blog ici à ce sujet, mais voici le code:
la source
mRecyclerView
n'est déclaré nulle part. Devrions-nous simplement le passer en paramètre dans le constructeur et le stocker dans un champ?onRecyclerViewAttached
et stockez-le dans une variable membre.TrackSelectionAdapter
classe et de l'utiliser dans ma liste? Comment "dériver mon adaptateur de votre classe"? Pouvez-vous répondre à ma question? Je suis tellement coincé: stackoverflow.com/questions/29695811/…C'est une manière très simple de le faire.
Avoir un
private int selectedPos = RecyclerView.NO_POSITION;
dans la classe d'adaptateur RecyclerView et sous la méthode onBindViewHolder, essayez:Et dans votre événement OnClick, modifiez:
Fonctionne comme un charme pour le tiroir Navigtional et les autres adaptateurs d'articles RecyclerView.
Remarque: assurez-vous d'utiliser une couleur d'arrière-plan dans votre mise en page en utilisant un sélecteur comme colabug clarifié:
Sinon setSelected (..) ne fera rien, rendant cette solution inutile.
la source
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/pressed_color" android:state_pressed="true"/> <item android:drawable="@color/selected_color" android:state_selected="true"/> <item android:drawable="@color/focused_color" android:state_focused="true"/> </selector>
vieHolder.getLayoutPosition
MISE À JOUR [26 / juil / 2017]:
j'espère que cela aidera.
la source
Votre implémentation fonctionne probablement si vous faites défiler le contenu hors de la vue, puis à nouveau dans la vue. J'avais un problème similaire lorsque je suis tombé sur votre question.
L'extrait de fichier suivant fonctionne pour moi. Mon implémentation visait la sélection multiple, mais j'ai jeté un hack là-dedans pour forcer la sélection unique. (* 1)
Comme indiqué dans cette question liée , la définition des écouteurs pour viewHolders doit être effectuée dans onCreateViewHolder. J'ai oublié de le mentionner précédemment.
la source
Je pense que j'ai trouvé le meilleur tutoriel sur la façon d'utiliser le RecyclerView avec toutes les fonctions de base dont nous avons besoin (simple + multisélection, surligner, onduler, cliquer et supprimer en multisélection, etc.).
Le voici -> http://enoent.fr/blog/2015/01/18/recyclerview-basics/
Sur cette base, j'ai pu créer une bibliothèque "FlexibleAdapter", qui étend un SelectableAdapter. Je pense que cela doit être une responsabilité de l'adaptateur, en fait, vous n'avez pas besoin de réécrire les fonctionnalités de base de l'adaptateur à chaque fois, laissez une bibliothèque le faire, vous pouvez donc simplement réutiliser la même implémentation.
Cet adaptateur est très rapide, il fonctionne hors de la boîte (vous n'avez pas besoin de l'étendre); vous personnalisez les éléments pour tous les types de vues dont vous avez besoin; ViewHolder sont prédéfinis: les événements courants sont déjà implémentés: clic simple et long; il maintient l'état après rotation et bien plus encore .
Jetez-y un œil et n'hésitez pas à l'implémenter dans vos projets.
https://github.com/davideas/FlexibleAdapter
Un Wiki est également disponible.
la source
Regardez ma solution. Je suppose que vous devez définir la position sélectionnée dans le support et le passer en tant que Tag of View. La vue doit être définie dans la méthode onCreateViewHolder (...). Il existe également un emplacement approprié pour définir l'écouteur pour la vue, comme OnClickListener ou LongClickListener.
Veuillez regarder l'exemple ci-dessous et lire les commentaires sur le code.
la source
il n'y a pas de sélecteur dans RecyclerView comme ListView et GridView mais vous essayez ci-dessous ce qui a fonctionné pour moi
créer un sélecteur dessinable comme ci-dessous
puis définissez ce dessinable comme arrière-plan de votre disposition de ligne RecyclerView comme
la source
Décision avec interfaces et rappels. Créer une interface avec des états de sélection et de désélection:
Implémenter l'interface dans ViewHolder:
Exécuter le changement d'état lors du rappel:
Créez RecyclerView avec Callback (exemple):
Voir plus dans l'article de iPaulPro: https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd#.6gh29uaaz
la source
c'est ma solution, vous pouvez définir sur un élément (ou un groupe) et le désélectionner d'un autre clic:
la source
J'ai eu le même problème et je le résolve de la manière suivante:
Le fichier xml qui utilise pour créer une ligne dans createViewholder, ajoutez simplement la ligne ci-dessous:
OU Si vous utilisez frameLayout comme parent de l'élément de ligne, alors:
Dans le code java à l'intérieur du support de vue où vous avez ajouté sur l'écouteur de clic:
la source
Je n'ai pas pu trouver une bonne solution sur le Web pour ce problème et je l'ai résolu moi-même. Il y a beaucoup de gens qui souffrent de ce problème. Je souhaite donc partager ma solution ici.
Lors du défilement, les lignes sont recyclées. Ainsi, les cases à cocher et les lignes en surbrillance ne fonctionnent pas correctement. J'ai résolu ce problème en écrivant la classe d'adaptateur ci-dessous.
Je mets également en œuvre un projet complet. Dans ce projet, vous pouvez cocher plusieurs cases. Les lignes contenant les cases à cocher sélectionnées sont mises en surbrillance. Et plus important encore, ceux-ci ne sont pas perdus lors du défilement. Vous pouvez le télécharger à partir du lien:
https://www.dropbox.com/s/ssm58w62gw32i29/recyclerView_checkbox_highlight.zip?dl=0
Captures d'écran de l'application:
la source
Réglez
private int selected_position = -1;
pour empêcher la sélection d'un élément au démarrage.la source
Le simple fait d'ajouter
android:background="?attr/selectableItemBackgroundBorderless"
devrait fonctionner si vous n'avez pas de couleur d'arrière-plan, mais n'oubliez pas d'utiliser la méthode setSelected. Si vous avez une couleur d'arrière-plan différente, je viens de l'utiliser (j'utilise la liaison de données);Set isSelected à la fonction onClick
Et ajoutez ceci à xml;
la source
Faire le sélecteur:
Définissez-le comme arrière-plan dans la mise en page de votre élément de liste
Dans votre adaptateur, ajoutez OnClickListener à la vue (méthode onBind)
Dans l'événement onClick, activez la vue:
la source