0
votes

Restaurer les éléments et la position de défilement dans ListView sur le changement d'orientation

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"));
            }
    }


0 commentaires

3 Réponses :


0
votes

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


1 commentaires

Cela fonctionne la première fois mais quand je tourne mon téléphone à la deuxième fois, la liste de ListView disparaît



0
votes

Vous devriez faire la même vérification, mais sur oncreate code> car onrestoreinstancestate code> n'est pas toujours appelé, est un peu délicat.

Vous pouvez vérifier cela à partir de la documentation:

Cette méthode est appelée après 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>

Déplacez votre logique sur 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"));
        }
    }
}


1 commentaires

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 ..



1
votes

à un degré non liée, vous devez probablement utiliser 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.

Quoi qu'il en soit, après l'approche actuelle, devrait être aussi simple que P>

@Override
protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    values = savedInstanceState.getParcelableArrayList("list");


0 commentaires