Android: RecyclerView.L'adaptateur ne fonctionne pas comme prévu
Mon id question directement liée à @Richard's à propos de la méthode onBindViewHolder() à l'intérieur de la RecyclerView.L'adaptateur n'est pas appelé, comme il (et moi) en attendre.
J'ai remarqué que cette méthode est appelée correctement jusqu'à la fin de mon dataset (9 CardViews, le défilement vers le bas), mais quand j'ai essayer de revenir (faire défiler vers le haut), il ne s'appelle pas plus. Le vrai problème, c'est que là je fais mes modifications dans le jeu de données et d'appel notifyDataSetChanged(), mais avec cette étrange (pour moi) le comportement de mes modifications ne prennent pas de place quand ils sont censés faire.
La photo, je l'joindre veut essayer de préciser:
- Je atteindre le fond de la Rec.Affichage (cardView - Décubitus dorsal: tout va bien);
- traiter avec les cartes déjà montré, totalement ou partiellement, il n'y a pas de problème (en Décubitus dorsal, le Gérondif et le Participe);
- mais quand j'arrive à la première cardView complètement occulté, onBindViewHolder() n'est pas appelée plus et je peux le voir dans le debug que le jeu de données liées à la carte est "Couchée", et ici, il est: de la position Couchée cardView est montré.
J'ai pensé que c'était exactement le même problème de Richard rencontrées dans sa question, et j'ai essayé sa exactement la même solution: j'ai forcé setHasStableIds() pour de vrai dans ma Carte du constructeur,
public CardAdapter(List<Object> items){
this.items = items;
adapterList = new ArrayList<String>();
formAdapt = new ConjFormAdapter(adapterList);
itemMap = new HashMap<Object, Long>();
setHasStableIds(true);
}
où itemMap est la Carte que j'mettre en œuvre dans mon activité pour définir l'id unique de mon dataset,
et emportait getItemId() de cette façon:
public long getItemId(int position) {
Object item = items.get(position);
return itemMap.get(item);
}
Mais comme vous pouvez le voir sur l'image, je reçois toujours ce résultat: aucune idée, s'il vous plaît?
Modifier
La mise en œuvre de itemMap dans mon activité:
for(int i=0, j=0; i<conj_items.size(); i++, j++)
conjAdapter.getItemMap().put(conj_items.get(i), (long) j);
où conj_items est la liste de tableaux je passe à la Carte.
Pourquoi ne pas simplement retourner la position de la carte d'identité? Comment est
itemMap
peuplée?J'ai édité ma question avec le code manquant. Pour Selvin: je ne comprends pas ce que vous êtes suggérant: ce que le "réel stable id" vous mentionner?
Juste retour
position
de getItemId
si vos éléments de données n'ont pas de réelle IdEn fait, j'ai déjà essayé cette solution mais rien n'a changé... Pourriez-vous me donner un exemple de la "Id", s'il vous plaît? Je suppose que ce sont les mêmes "réel stable id" @Selvin parlait!
OriginalL'auteur Massimo Baldrighi | 2015-01-29
Vous devez vous connecter pour publier un commentaire.
Lorsque vous
setHasStableIds(true)
vous devez mettre en œuvregetItemId(int position)
avecreturn position
.Actuelle morceau de code
setHasStableIds(true)
seulement dit votre adaptateur que les articles ne changera pas de position donnée et l'adaptateur sans avoir à appeler onBindViewHolder pour ce poste de nouveaureturn position
n'est pas conseillé, sauf si vous savez que vos listes d'éléments (ou plus exactement leur "identité") ne changera pas pendant les mises à jour. Si il est possible que de nouveaux éléments sont ajoutés, supprimés ou déplacés, cela ne fonctionnera pas. Vous devez utiliser un identifiant unique de l'élément à la place.OriginalL'auteur Vlad Palamarchuk
J'ai eu la même exception, mais c'était en fait causé par un problème différent. Après avoir essayé
setHasStableIds(true)
etsetLayoutTransition(null)
, chacun avec pas de chance, j'ai réalisé que j'étais en ajoutant le point de vue de la mère dansonCreateViewHolder
(dont je ne l'aurais pas fait parce que l'adaptateur prend en charge pour vous). Je l'ai enlevé, et le problème a été résolu.OriginalL'auteur wildcat12