Comment faire RecyclerView de défilement en douceur?
C'est plus une question générique, mais après beaucoup de recherche et d'essai, je ne suis pas en mesure de comprendre pourquoi c'est si difficile à atteindre. Cette est le plus proche de la réponse que je peux trouver, mais toujours incapable de mettre en œuvre.
Pour être précis, je suis en utilisant RecyclerView avec GridLayoutManager. Tout ce que je veux est la présentation de la grille de défilement en douceur (comme par défaut gallary app) ,rien de fantaisie, mais le défaut de mise en œuvre de la grille de mise en page du gestionnaire de parchemins de la vue dans un "saccadé" manière. J'ai essayé de mettre en œuvre la méthode du lien ci-dessus, mais sans succès.
J'ai aussi essayé de mettre en œuvre LinearSmoothScroller mais je ne suis pas sûr de la façon de mettre en œuvre computeScrollVectorForPosition méthode. Google documents sur computeScrollVectorForPosition a littéralement 0 mots.
J'ai trouvé ce 3 partie tutoriel, mais c'était de très peu d'aide. Donc, tout ce que je veux poser est: peut-il y avoir une sorte de modèle de code qui nous pouvons mettre en œuvre dans LinearSmoothScroller ou par extension de l'RecyclerView.SmoothScroller et de parvenir à défilement lisse ? Même si le code dépend du nombre d'éléments par ligne dans gridlayout, il y a une méthode pour le faire facilement. Suis-je manqué quelque chose ?
StrictMode
, et ainsi de suite.Donc vous voulez dire par défaut de mise en œuvre de GridLayoutManager défiler le contrôle gridview en douceur ? Je suis désolé si j'ai l'air noob, je suis tout à fait nouvelle pour Android Programmation.
"Donc vous voulez dire par défaut de mise en œuvre de GridLayoutManager défiler le contrôle gridview en douceur ?" -- oui, au moins pour ma définition de "douceur". La source typique de "saccadé" défilement dans Android est l'application qui prennent trop de temps sur le thread principal de l'application mise à jour de l'INTERFACE utilisateur. Dans le cas de
RecyclerView
, ce serait prendre trop de temps dans onBindViewHolder()
ou éventuellement dans onCreateViewHolder()
. Ceux chaque besoin de retourner dans le sous-ordre de la milliseconde fois, ce qui signifie que vous ne peut pas faire d'I/O disque ou réseau I/O en eux.Merci pour votre réponse, je pense que j'ai trouvé le problème. Je suis à l'aide de
holder.photo.setImageBitmap(BitmapFactory.decodeFile(itemList.get(position).getAbsolutePath()));
sur onBindViewHolder() et le fichier d'image est d'environ 100 ko chacune une dizaine d'images dans la liste. Je vais essayer de faire une meilleure mise en œuvre.OriginalL'auteur rockfight | 2015-07-06
Vous devez vous connecter pour publier un commentaire.
La source typique de "saccadé" défilement dans Android est l'application qui prennent trop de temps sur le thread principal de l'application mise à jour de l'INTERFACE utilisateur. Dans le cas de
RecyclerView
, ce serait prendre trop de temps dansonBindViewHolder()
ou éventuellement dansonCreateViewHolder()
. Ceux chaque besoin de retourner dans le sous-ordre de la milliseconde fois, ce qui signifie que vous ne peut pas faire d'I/O disque ou réseau I/O en eux.Oui, que va faire le disque I/O et le décodage des images sur le thread principal de l'application. Qui sera assez lent, à cause jank dans l'INTERFACE utilisateur (c'est à dire, "saccadé" scrolling).
Envisager d'utiliser une image de chargement de la bibliothèque, comme Picasso ou Universel, Chargeur d'Image, car ils peuvent remplir votre
ImageView
de l'image bitmap en mode asynchrone.Cet exemple d'application utilise l'Image Universelle de Chargeur pour aider à remplir le contenu d'un
RecyclerView
(avecGridLayoutManager
), avec la source de données étant les vidéos disponibles sur le périphérique.Parce que cela a peu à voir avec votre problème. L'objectif de cette page est l'efficacité de mémoire, pas d'application principal fil du temps.
UIL ne fonctionne pas alors que l'image réside dans la carte sd (chemin de fichier commence par
/storage
. J'ai utiliséGlide
à cette fin, et il a fourni une parfaite solution à mon problèmeC'est un travail pour moi. Je fais face à un même problème avec une image de grande taille. Lorsque nous avons mis l'image dans
ImageView
à l'aide deBitmap
puis il travail charmes comme @CommonsWare réponse.dans mon application la recyclerview défilement n'est pas lisse, depuis que je suis gonfler les vues à l'intérieur de onBindViewHolder, est-il une autre façon d'ajouter un affichage sans mise en page inflater.
OriginalL'auteur CommonsWare
Ajouter ce partout où vous avez déclaré
RecyclerView
dans votreActivity
ouFragment
OriginalL'auteur Ahmed Raza
J'ai juste du faire face à ce problème, et la désactivation de la imbriquée de défilement fixe.
De faire comme ceci:
Ou vous pouvez modifier la valeur dans le fichier xml où vous avez défini RecyclerView:
OriginalL'auteur Arman Ramezanzadeh
J'ai juste du faire face à ce problème, et j'ai eu
J'ai mis le
RecyclerView
dansScrollView
Merci donc de ne jamais mettre les
RecyclerView
à l'intérieur de laScrollView
qui peut aussi causer des.Qui retourne toujours une valeur fixe. Et aussi vérifier
OriginalL'auteur Shyam Sundar
OriginalL'auteur Bishwajeet Biswas
J'ai fait le défilement lisse en remplaçant la
calculateSpeedPerPixel(DisplayMetrics displayMetrics)
méthode:OriginalL'auteur SKP
il suffit d'ajouter ce
dans recyclerview xml
OriginalL'auteur Sagar Yadav