Comment enregistrer RecyclerView de la position de défilement à l'aide de RecyclerView.De l'état?
J'ai une question sur Android RecyclerView.État.
Je suis à l'aide d'un RecyclerView, comment pourrais-je l'utiliser et de le lier avec RecyclerView.De l'état?
Mon but est de enregistrer le RecyclerView de la position de défilement.
Vous devez vous connecter pour publier un commentaire.
Comment envisagez-vous d'enregistrer la dernière position enregistrée avec
RecyclerView.State
?Vous pouvez toujours compter sur ol' bonne sauvegarde de l'état. Étendre
RecyclerView
et remplacer onSaveInstanceState() etonRestoreInstanceState()
:Fragment
, monLinearLayoutManager.childCount
a toujours été0
.Si vous utilisez LinearLayoutManager, il est livré avec pré-construit enregistrer api linearLayoutManagerInstance.onSaveInstanceState() et api restauration linearLayoutManagerInstance.onRestoreInstanceState(...)
Avec cela, vous pouvez enregistrer le retour de l'parcelable à votre outState. par exemple,
et de restaurer la restaurer la position avec l'état que vous avez enregistré. e.g,
Pour l'emballage de tous, votre code final ressemblera à quelque chose comme
Edit: Vous pouvez également utiliser la même api avec l'GridLayoutManager, comme c'est une sous-classe de LinearLayoutManager. Merci @wegsehen pour la suggestion.
Edit: Rappelez-vous, si vous êtes également le chargement des données dans un thread d'arrière-plan, vous aurez besoin d'un appel à onRestoreInstanceState au sein de votre onPostExecute/onLoadFinished méthode pour que le poste soit restaurée lors de changement d'orientation, par exemple
RecyclerView
mais pas si vous avez uneViewPager
avec unRecycerView
sur chaque page.onCreateView
, mais après le chargement des données. Voir @Farmaker réponse ici.onViewStateRestored
. Cela a fonctionné pour moi. ex: ` adaptateur.submitList(homeContentList) if (!homeContentList.isEmpty()) { contentRecyclerView.scrollToPosition(0) emptyContent.visibilité = ALLÉS contentRecyclerView.layoutManager?.onRestoreInstanceState(ce.savedRecyclerLayoutState) }`Magasin
Restaurer
et si cela ne fonctionne pas, essayez
Mettre stocker dans
onPause()
et la restauration dans
onResume()
lastFirstVisiblePosition
à0
après restauration. Ce cas est utile lorsque vous avez un fragment/activité de chargement de données différentes dans unRecyclerView
, par exemple, d'un explorateur de fichiers de l'app.SwipeRefreshLayout
?Je Définir des variables dans onCreate(), enregistrer la position de défilement dans onPause() et de définir la position de défilement dans onResume()
Je voulais sauver Recycleur de Vue de la position de défilement lors de la navigation à l'écart de ma liste d'activité, puis en cliquant sur le bouton retour pour revenir en arrière. Beaucoup de solutions à ce problème ont été soit beaucoup plus compliqué que nécessaire ou n'a pas fonctionné pour ma configuration, j'ai donc pensé que je devais partager ma solution.
D'abord l'enregistrer dans votre état de l'instance dans onPause comme beaucoup l'ont montré. Je pense qu'il est utile de souligner ici que cette version de onSaveInstanceState est une méthode de la RecyclerView.Classe LayoutManager.
La clé pour obtenir que cela fonctionne correctement, assurez-vous d'appeler onRestoreInstanceState après vous connectez votre adaptateur, comme certains l'ont indiqué dans d'autres threads. Cependant, le réel de l'appel de méthode est beaucoup plus simple que beaucoup ont indiqué.
Vous n'avez pas à enregistrer et restaurer l'état par vous-même plus. Si vous définissez l'ID unique en xml et recyclerView.setSaveEnabled(vrai) (vrai par défaut), le système va automatiquement faire.
Ici, c'est plus à ce sujet: http://trickyandroid.com/saving-android-view-state-correctly/
C'est comment j'ai restaurer RecyclerView position avec GridLayoutManager après la rotation lorsque vous avez besoin de récupérer les données à partir d'internet avec AsyncTaskLoader.
Faire une variable globale de Parcelable et GridLayoutManager et un static final string:
Enregistrer l'état de gridLayoutManager dans onSaveInstance()
De restauration en onRestoreInstanceState
Puis lorsque chargeur récupère des données à partir d'internet vous restaurer recyclerview position dans onLoadFinished()
..bien sûr, vous devez instancier gridLayoutManager à l'intérieur onCreate.
Cheers
Tous les gestionnaires de disposition regroupés dans la bibliothèque de prise en charge savez déjà comment sauvegarder et de restaurer la position de défilement.
La position de défilement est restaurée sur la première passe de mise en page qui se produit lorsque les conditions suivantes sont remplies:
RecyclerView
RecyclerView
En général, vous définissez la mise en page du gestionnaire XML de sorte que tous vous avez à faire maintenant est
RecyclerView
Vous pouvez le faire à tout moment, il n'est contraint à
Fragment.onCreateView
ouActivity.onCreate
.Exemple: s'Assurer que l'adaptateur est attaché à chaque fois que les données sont mises à jour.
L'sauvé la position de défilement est calculé à partir des données suivantes:
Donc vous pouvez vous attendre à une légère discordance par exemple, si vos articles ont des dimensions différentes en orientation portrait et paysage.
Voici ma Démarche d'enregistrer et de les maintenir à l'état de recyclerview dans un fragment.
Tout d'abord, ajoutez les modifications de configuration dans votre activité parent comme le code ci-dessous.
Puis dans votre Fragment de déclarer ces méthode d'instance de la
Ajouter le code ci-dessous dans votre @méthode onPause
Ajouter onConfigartionChanged Méthode comme ci-dessous.
Cette approche permettra de filtrer votre problème.
si Vous avez diffrent le gestionnaire de configuration puis il suffit de remplacer supérieure layout manager.
Sur Android API de Niveau 28, j'ai tout simplement ce que j'ai mis en place mon
LinearLayoutManager
etRecyclerView.Adapter
dans monFragment#onCreateView
méthode, et tout Simplement Travaillé™️. Je n'ai pas besoin de faire unonSaveInstanceState
ouonRestoreInstanceState
travail.Eugen Pechanec réponse explique pourquoi cela fonctionne.
Pour moi, le problème était que j'avais mis en place un nouveau layoutmanager chaque fois que j'ai changé ma carte, perdre que la position de défilement sur recyclerView.
Je voudrais juste partager la récente situation que je rencontre avec le RecyclerView. J'espère que quelqu'un rencontre le même problème en bénéficieront.
Mon Projet:
J'ai donc un RecyclerView que la liste de certains éléments cliquables dans mon Activité Principale (Activité A). Lorsque l'Élément est cliqué, une nouvelle Activité est illustré avec des Détails de l'Élément (Activité B).
J'ai mis en place dans le Manifeste le fichier que l'Activité-l'Un est le parent de l'Activité-B, de cette façon, j'ai le dos ou sur le bouton d'accueil sur le ActionBar de l'Activité-B
Problème:
Chaque fois que j'ai appuyé sur le Dos ou le bouton d'Accueil de l'Activité-B ActionBar, l'Activité-l'Un va dans la totalité de l'Activité du Cycle de Vie à partir de onCreate()
Même si j'ai mis en place un onSaveInstanceState() sauvegarde de la Liste des RecyclerView de la Carte, lorsque l'Activité-Un commence son cycle de vie, le saveInstanceState est toujours la valeur null dans le onCreate() de la méthode.
Creusement plus loin dans l'internet, je suis tombé sur le même problème, mais la personne a remarqué que l'Arrière ou le bouton d'Accueil en dessous de la Anroid de l'appareil (par Défaut/Home bouton), l'Activité-l'Un ne va dans l'Activité du Cycle de Vie.
Solution:
J'ai activé la maison ou le bouton de retour sur l'Activité-B
Sous onCreate() la méthode ajouter cette ligne supportActionBar?.setDisplayHomeAsUpEnabled(vrai)
Dans l'annuler plaisir onOptionsItemSelected() la méthode, j'ai vérifié pour l'élément.ItemId l'élément cliqué en fonction de l'id. L'Id du bouton de retour est
android.R.id.maison
Puis de mettre en œuvre un finish() appel de fonction à l'intérieur de l'android.R.id.maison
Ce sera la fin de l'Activité-B et apporter Acitivy-Un sans passer par le cycle de vie.
À mon exigence, c'est la meilleure solution à ce jour.
J'ai eu la même exigence, mais les solutions n'ai pas très bien moi sur la ligne, en raison de la source de données pour le recyclerView.
J'étais l'extraction de la RecyclerViews' LinearLayoutManager état onPause()
Parcelable
state
est enregistré dansonSaveInstanceState(Bundle outState)
, et extrait à nouveau dansonCreate(Bundle savedInstanceState)
, quandsavedInstanceState != null
.Cependant, la recyclerView adaptateur est rempli et mis à jour par un ViewModel LiveData objet retourné par une DAO appel à une base de données de chambres.
J'ai finalement trouvé que la restauration de l'état de l'instance directement après la collecte de données est définie dans la carte permettrait de garder le défilement de l'état à travers les rotations.
Je suppose que c'est parce que le
LinearLayoutManager
état que j'avais restauré a été de remplacement lorsque les données ont été renvoyé par la base de données d'appel, ou la restauration de l'état n'a aucun sens face à un "vide" LinearLayoutManager.Si la carte de données est disponible directement (c'est à dire sans contingent sur une base de données d'appel), puis la restauration de l'état de l'instance sur la LinearLayoutManager peut être effectué après la carte est définie sur la recyclerView.
La distinction entre les deux scénarios m'a tenu jusqu'pour les âges.
Activity.java:
Pourquoi je suis en utilisant
OnSaveInstanceState()
dansonPause()
moyen, Alors que passer à une autre activité onPause serait appelé.Il vous permettra d'économiser que la position de défilement et de restauration de la position lorsque nous de revenir sur une autre activité.