2017-10-07 2 views
0

J'ai une boucle améliorée, qui va gonfler de manière dynamique de nombreuses dispositions concernant le nombre de valeurs contenues dans mon tableau.Comment enregistrer l'état des vues conservées dans le viewpager dynamique

Cela fonctionne parfaitement, cependant, il y a une méthode appelée à chaque itération, qui fonctionne également mais il y a un gros bug dont j'ai besoin d'aide pour résoudre. Imaginez qu'il y ait 5 articles dans mon tableau, donc 5 mises en page sont gonflées, dans ces mises en page il y a une petite section de type carte à gratter sur la mise en page.

Maintenant, si l'utilisateur est sur la page 1, utilise la carte à gratter, puis passe à la page 2, utilise la carte à gratter etc etc, cela fonctionne très bien.

Mais si l'utilisateur est sur la page 1, puis va à dire, page 5, puis de nouveau à la page 1 (essentiellement dans un ordre aléatoire), la carte à gratter ne fonctionne pas. D'après ce que je comprends, la raison en est que la méthode est appelée implémentée à chaque itération et que la vue perd son état si l'utilisateur fait défiler ou fait défiler dans des ordres aléatoires.

Par conséquent, j'ai besoin d'un moyen d'enregistrer l'état d'affichage créé dans mon viewpager.

Est-ce possible pour mon scénario? J'ai fait de mon mieux pour trouver une solution, mais je n'arrive pas à trouver quelque chose qui me semble pertinent pour ma question.

Voici un extrait du code en question. Merci pour vos conseils ou suggestions!

for (String x : array1) { 
       //loop out the number of layouts relative to the number of questions held in x 
       View current_layout = LayoutInflater.from(getActivity()).inflate(R.layout.question_fragment, null); 
       //use the pageAdapter to add the layout to the users view 
       pagerAdapter.addView(current_layout); 

       //call method to add functionality to the scratchcard 
       isCorrect(current_layout); 
} 



public void isCorrect(View current_layout) { 



     ScratchoffController controller1 = new ScratchoffController(getActivity()) 
       .setThresholdPercent(0.40d) 
       .setTouchRadiusDip(getActivity(), 30) 
       .setFadeOnClear(true) 
       .setClearOnThresholdReached(true) 
       .setCompletionCallback(() -> { 
       }) 
       .attach(current_layout.findViewById(R.id.scratch_view1), current_layout.findViewById(R.id.scratch_view_behind1)); 



     ScratchoffController controller2 = new ScratchoffController(getActivity()) 
       .setThresholdPercent(0.40d) 
       .setTouchRadiusDip(getActivity(), 30) 
       .setFadeOnClear(true) 
       .setClearOnThresholdReached(true) 
       .setCompletionCallback(() -> { 
       }) 
       .attach(current_layout.findViewById(R.id.scratch_view2), current_layout.findViewById(R.id.scratch_view_behind2)); 

     ScratchoffController controller3 = new ScratchoffController(getActivity()) 
       .setThresholdPercent(0.40d) 
       .setTouchRadiusDip(getActivity(), 30) 
       .setFadeOnClear(true) 
       .setClearOnThresholdReached(true) 
       .setCompletionCallback(() -> { 
       }) 
       .attach(current_layout.findViewById(R.id.scratch_view3), current_layout.findViewById(R.id.scratch_view_behind3)); 

     ScratchoffController controller4 = new ScratchoffController(getActivity()) 
       .setThresholdPercent(0.40d) 
       .setTouchRadiusDip(getActivity(), 30) 
       .setFadeOnClear(true) 
       .setClearOnThresholdReached(true) 
       .setCompletionCallback(() -> { 
       }) 
       .attach(current_layout.findViewById(R.id.scratch_view4), current_layout.findViewById(R.id.scratch_view_behind4)); 



    } 
+0

Vous devez publier le code dans votre implémentation de pageur de vue réelle (comme s'il contenait des fragments ou juste des vues?). Vos exemples de code manquent de contexte. – dominicoder

Répondre

0

J'utilise ussually ViewPager avec Fragments et ce que vous mentionnez a happend à moi quand j'essaie de garder les références aux instances de Fragment (dans mon cas) en dehors de la viewpager. Cela se produit parce que le viewpager peut créer de nouvelles occurrences du fragment qu'il contient lorsque vous renommez l'onglet comme vous le mentionnez. Lorsque cela se produit, la référence d'instance que vous détenez en dehors du viewpager n'est plus ce que le viewpager montre.

Dans votre cas, according to this question, vous devez utiliser instatiateItem et destroyItem. Je pense que vous pouvez utiliser ces méthodes pour enregistrer l'état de restauration de l'état, et vous pouvez également mettre à jour toute référence externe lorsque instantiateItem est appelé.