J'essaie d'actualiser un élément spécifique dans RecyclerView
.
Histoire: chaque fois que l'utilisateur clique sur l'élément, cela s'affiche AlertDialog
. L'utilisateur peut taper du texte en cliquant sur le bouton OK. Je veux afficher ce texte dans cet élément et afficher invisible ImageView
- déclaré en XML et adaptateur ViewHolder
-
J'ai utilisé cette fonction dans AlertDialog
Positive Button pour mettre à jour l'élément:
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
Mais ce code modifie non seulement le itemView à la position passée, mais modifie également certains des autres itemView!
Comment dois-je modifier correctement un itemView spécifique en cliquant dessus?
onBindViewHolder()
Mettre à jour un seul élément
notifyItemChanged(updateIndex)
Exemple
Modifiez l'élément "Moutons" pour qu'il dise "J'aime les moutons".
Ma réponse complète avec plus d'exemples est ici .
la source
Ajoutez le texte modifié à votre liste de données de modèle
la source
Je pense que j'ai une idée sur la façon de gérer cela. La mise à jour est identique à la suppression et au remplacement à la position exacte. Je supprime donc d'abord l'élément de cette position en utilisant le code ci-dessous:
puis j'ajouterais l'élément à cette position particulière, comme indiqué ci-dessous:
J'essaye d'implémenter ceci maintenant. Je vous ferai part de vos commentaires lorsque j'aurai terminé!
la source
Je dois résoudre ce problème en saisissant la position de l'élément à modifier, puis dans l'appel de l'adaptateur
, cela appellera onBindViewHolder (titulaire ViewHolder, position int) pour cet élément spécifique à cette position spécifique.
la source
La solution ci-dessous a fonctionné pour moi:
Sur un élément RecyclerView, l'utilisateur cliquera sur un bouton mais une autre vue comme TextView se mettra à jour sans notifier directement l'adaptateur:
J'ai trouvé une bonne solution pour cela sans utiliser la méthode notifyDataSetChanged (), cette méthode recharge toutes les données de recyclerView donc si vous avez une image ou une vidéo à l'intérieur de l'élément, elles se rechargeront et l'expérience utilisateur ne sera pas bonne:
Voici un exemple de clic sur une icône de type ImageView et ne met à jour qu'un seul TextView (possibilité de mettre à jour plus de vue de la même manière pour le même élément) pour afficher la mise à jour du comptage après l'ajout de +1:
la source
Une façon qui a fonctionné pour moi personnellement, consiste à utiliser les méthodes d'adaptateur de recyclerview pour gérer les changements dans ses éléments.
Cela irait d'une manière similaire à ceci, créez une méthode dans la vue de votre recycleur personnalisé un peu comme ceci:
la source
Dans votre classe d'adaptateur, dans la méthode onBindViewHolder, définissez ViewHolder sur setIsRecyclable (false) comme dans le code ci-dessous.
la source
il vous suffit d'ajouter le code suivant dans la boîte de dialogue d'alerte lors de l'enregistrement, cliquez sur
la source
Le problème est
RecyclerView.Adatper
que ne fournit aucune méthode qui renvoie l'index de l'élémentMa solution de contournement consiste à créer une instance de carte pour (élément, position) s
Friend
) doit implémenterhashCode()
etequals()
parce qu'il est clé dans hashmap.quand un élément a changé,
Il est bon de définir une méthode d'assistance
L'instance de carte (
Map<Friend, Integer> posMap
) n'est pas nécessairement requise. Si la carte n'est pas utilisée, une boucle dans toute la liste peut trouver la position d'un élément.la source
C'est aussi mon dernier problème. Voici ma solution J'utilise le modèle de données et l'adaptateur pour mon RecyclerView
la source
si vous créez un objet et l'ajoutez à la liste que vous utilisez dans votre adaptateur, lorsque vous modifiez un élément de votre liste dans l'adaptateur, tous vos autres éléments changent également, en d'autres termes, tout est question de références et votre liste ne change pas détenez des copies séparées de cet objet unique.
la source
Dans votre adaptateur RecyclerView, vous devez avoir un ArrayList et également une méthode
addItemsToList(items)
pour ajouter des éléments de liste à ArrayList. Ensuite, vous pouvez ajouter des éléments de liste par appel deadapter.addItemsToList(items)
manière dynamique. Une fois tous vos éléments de liste ajoutés à ArrayList, vous pouvez appeleradapter.notifyDataSetChanged()
pour afficher votre liste.Vous pouvez utiliser le
notifyDataSetChanged
dans l'adaptateur pour RecyclerViewla source