如何保存动态viewpager

时间:2017-10-07 20:39:47

标签: android loops android-viewpager

我有一个增强的循环,它会动态地膨胀与我的数组中保存的值的数量相关的许多布局。

这很好用,但每次迭代都会调用一个方法,这个方法也有效,但是我需要帮助解决一个大错误。

想象一下,我的数组中有5个项目,因此有5个布局被夸大,在这些布局中,布局上有一个小刮刮卡类型部分。

现在如果用户在第1页,使用刮刮卡,然后转到第2页,使用刮刮卡等,它工作正常。

但是如果用户在第1页上然后转到第5页然后再回到第1页(基本上是随机顺序),则刮刮卡不起作用。

根据我的理解,其原因是该方法被称为在每次迭代时实现,如果用户向后滚动或以随机顺序滚动,则视图将失去其状态。

因此我需要一种方法来保存我的viewpager中创建的视图状态。

这可能适用于我的情况吗?我尽力找到解决方案,但找不到与我的问题相关的东西。

以下是相关代码的片段。感谢您的任何指导或建议!

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



    }

1 个答案:

答案 0 :(得分:0)

我通常使用带有片段的ViewPager,当我尝试在viewpager之外保留对Fragment实例(在我的例子中)的引用时,你提到的内容已经发生在我身上。

这是因为当您按照提及的方式重新选择选项卡时,viewpager可能会创建它包含的Fragment的新实例。发生这种情况时,您在viewpager之外保存的实例引用不再是viewpager所显示的内容。

在您的情况下,according to this question,您必须更加instatiateItemdestroyItem。我认为您可以使用这些方法来保存状态恢复状态,并且还可以在调用instantiateItem时更新任何外部引用。