J'ai essayé, par plusieurs moyens, de restaurer les données d'une liste de répertorie lorsque l'utilisateur fait pivoter son téléphone .. Cependant, j'ai des difficultés à cause du fait que lorsque je tourne l'écran une fois, cela fonctionne, mais quand je le tourne Plus d'une autre fois, cela ne fonctionne plus. De plus, j'ai essayé de restaurer la position de défilement mais sans succès.
Je voudrais donc savoir la meilleure façon de le faire. P>
My Code: P>
@Override protected void onSaveInstanceState(@NonNull Bundle outState) { outState.putParcelableArrayList("list", values); outState.putParcelable("pos", item_container.onSaveInstanceState()); super.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); ArrayList<Song.Hits> values = savedInstanceState.getParcelableArrayList("list"); if (values != null) { CAdapter adapter = new CAdapter(values); item_container.setAdapter(adapter); item_container.onRestoreInstanceState(savedInstanceState.getParcelable("pos")); } }
3 Réponses :
Vous devez également mettre à jour la méthode OnCreate ou la méthode surPostCreate et ajouter la logique que vous avez utilisée dans OnrestoreInstanCestate lors de la vérification si SavedInstanCestate! = Null P>
Cela fonctionne la première fois mais quand je tourne mon téléphone à la deuxième fois, la liste de ListView disparaît
Vous devriez faire la même vérification, mais sur Vous pouvez vérifier cela à partir de la documentation: Cette méthode est appelée après Déplacez votre logique sur oncreate code> car
onrestoreinstancestate code> n'est pas toujours appelé, est un peu délicat.
OnStart () Code> lorsque l'activité est en cours
réinitialisé à partir d'un état précédemment enregistré, donné ici dans
SavedInsTanState code>. La plupart des implémentations utiliseront simplement
Oncreate (Bundle) Code> Pour restaurer leur état, mais c'est parfois
pratique de le faire ici après la finalisation de toute l'initialisation
ou permettre aux sous-classes de décider d'utiliser votre valeur par défaut
la mise en oeuvre. La mise en œuvre par défaut de cette méthode effectue un
restaurer de tout état d'affichage qui avait déjà été congelé par
OnsaveInstancestate (Bundle) Code>. P>
blockQuote>
Oncreate CODE> et tout ira bien p>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
item_container = findViewById(R.id.bottom_popup_container);
if (savedInstanceState != null) {
ArrayList<Song.Hits> values = savedInstanceState.getParcelableArrayList("list");
if (values != null) {
CAdapter adapter = new CAdapter(values);
item_container.setAdapter(adapter);
item_container.onRestoreInstanceState(savedInstanceState.getParcelable("pos"));
}
}
}
Le même comportement reste toujours, cela fonctionne bien la première fois, mais quand je tourne mon téléphone une autre fois, la liste de ListView disparaît ..
à un degré non liée, vous devez probablement utiliser Quoi qu'il en soit, après l'approche actuelle, devrait être aussi simple que P> recyclerview code> au lieu de
listview code>, qui prend également en charge une stratégie de restauration de l'état personnalisé afin que l'état de défilement soit automatiquement préservé jusqu'à ce que l'état de défilement soit automatiquement préservé Les données sont définies.
@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
values = savedInstanceState.getParcelableArrayList("list");