如何在viewpager中的视图之间保存按钮按下的状态和值?

时间:2014-10-29 13:55:29

标签: java android android-viewpager

现在我有一个Adapter类,它扩展了PagerAdapter。在里面我有我的InstantiateItem()方法。

这里我在视图上实例化了几个按钮:

            @Override
            public Object instantiateItem(ViewGroup parent, final int position) {

                final int delPosition = position;
                //Get the inflater
                LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

                //inflate the root layout
                View view = inflater.inflate(R.layout.collection, null);

                //Grab instance of image
                ImageView imageView = (ImageView) view.findViewById(R.id.region);

                //Sets a drawable as the content of this ImageView.
                imageView.setImageResource(regionImages.get(position));

                //scores toggle buttons
                zero = (ToggleButton) view.findViewById(R.id.number_zero);
                one = (ToggleButton) view.findViewById(R.id.number_one);
                two = (ToggleButton) view.findViewById(R.id.number_two);
                three = (ToggleButton) view.findViewById(R.id.number_three);
                four = (ToggleButton) view.findViewById(R.id.number_four);
                five = (ToggleButton) view.findViewById(R.id.number_five);
                six = (ToggleButton) view.findViewById(R.id.number_six);
                seven = (ToggleButton) view.findViewById(R.id.number_seven);
                eight = (ToggleButton) view.findViewById(R.id.number_eight);
                nine = (ToggleButton) view.findViewById(R.id.number_nine);
                ten = (ToggleButton) view.findViewById(R.id.number_ten);

                one.setOnClickListener(createClickListener(1));
                two.setOnClickListener(createClickListener(2));
                three.setOnClickListener(createClickListener(3));
                four.setOnClickListener(createClickListener(4));
                five.setOnClickListener(createClickListener(5));
                six.setOnClickListener(createClickListener(6));
                seven.setOnClickListener(createClickListener(7));
                eight.setOnClickListener(createClickListener(8));
                nine.setOnClickListener(createClickListener(9));
                ten.setOnClickListener(createClickListener(10));

                //Back Arrow Button
                final ImageView back_button = (ImageView) view.findViewById(R.id.back_nav_arrow);

                back_button.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View view) {

                        //it doesn't matter if you're already in the first item
                        viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
                    }
                });


                //forward button 
                final ImageView forward_button = (ImageView) view.findViewById(R.id.forward_nav_arrow);

                forward_button.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View view) {

                        //it doesn't matter if you're already in the last item
                        viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                    }
                });

                parent.addView(view, 0);
                return view;
            }

这里是buttosn的onClick操作:

//onClickListener method that returns an interface
    private View.OnClickListener createClickListener(final int value) {
        return new View.OnClickListener()  {

            @Override
            public void onClick(View view) {

                buttonValue = value;

                ToggleButton clickedButton = (ToggleButton) view;
                RadioGroup radioGroup= (RadioGroup) clickedButton.getParent();

                for (int i = 0; i < radioGroup.getChildCount(); ++i) {
                    View nextChild = radioGroup.getChildAt(i);
                    if (!(nextChild instanceof ToggleButton)) {
                        continue;
                    }
                    if (nextChild.getId() != clickedButton.getId() || !clickedButton.isChecked()) {
                        ToggleButton tb2 = (ToggleButton) nextChild;
                        tb2.setChecked(false);
                    }
                }
            }

        };
    }

我希望能够保存按下按钮的状态(现在它就像一个单选按钮,当用户点击它时,按下按钮状态直到它们移动到另一个按钮)和viewpager中视图之间的buttonValue。

最终,我想在我的viewpager结尾处查看一个视图,我可以列出每个视图的所有分数,并让用户返回到其他视图,并且仍然按下按钮状态,以便他们可以确认在视图之间滑动。

我现在面临两个问题:

1)仅保存最后一个buttonValue,而不是所有视图的所有buttonValues。如何在所有视图中保存所有分数而不仅仅是最后一个视图中的最后分数?

2)从一个视图转到另一个视图并返回,仍然按下按钮状态。但是,如果我从最后一点转到第三个视图,按下的按钮状态不再成立。我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:2)

我认为现在是时候使用片段,虽然你可以在没有它的情况下实现你想要的东西但是使用片段会带来很多好处,例如在你的活动被销毁(旋转)时保存你的价值或使用生命周期回调方法或重用它适合您未来的项目。无论如何:

  

1)仅保存最后一个buttonValue而不是所有buttonValues   所有观点。如何在所有的分数中保存所有分数   观点而不仅仅是最后一个观点中的最后一个分数?

保存按钮的状态无论如何你喜欢在例如sharedpreference,数据库或自定义对象列表中作为你的活动或适配器的成员,如下所示:

class MyToggleButton{
   boolean mState; // false = unpressed, true = pressed

}

并使用List<MyToggleButton>存储它们。

  

2)从一个视图转到另一个视图并返回,按钮状态仍然是   按下。但是,如果我从最后一点进入第三个视图,那么   按下状态按下不再是真的。我该如何解决这个问题?

您可以在List<MyToggleButton>使用instantiateItem来确定哪个按钮必须具有哪种状态,以便您可以正确设置它。当用户更改任何按钮的状态时,您必须更新MyToggleButton状态,以便在您查看List<MyToggleButton>时找到正确的状态。