如何在ViewPager中刷新当前视图

时间:2011-12-26 10:12:49

标签: android android-viewpager

我正在使用ViewPager视图V1,V2,V3 .....我试图通过单击按钮来设置每个视图中使用的LinearLayout的可见性。通过此代码,它将更改应用于下一个视图而不是当前视图。例如我在V5上。当我点击它隐藏/显示V6上的对象。如果我从V6倒退到V5,那么它会在V4上应用更改。

以下是代码:

public class FragmentStatePagerSupport extends FragmentActivity {
    static final int NUM_ITEMS = 10;
    MyAdapter mAdapter;
    ViewPager mPager;
    static int mNum;

    private Button btn_zoom;
    static LinearLayout LL_Head;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_pager);

        mAdapter = new MyAdapter(getSupportFragmentManager());

        mPager = (ViewPager)findViewById(R.id.pager);
        mPager.setAdapter(mAdapter);
        mPager.setCurrentItem(5);

        btn_zoom = (Button)findViewById(R.id.btn_zoom);
    btn_zoom.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
                if (LL_Head.getVisibility() == View.VISIBLE) {
                    LL_Head.setVisibility(View.GONE);
                }else{
                    LL_Head.setVisibility(View.VISIBLE);
                }
            }
        });

.
.
.


    }

    public static class MyAdapter extends FragmentStatePagerAdapter {
        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public int getCount() {
            return NUM_ITEMS;
        }

        @Override
        public Fragment getItem(int position) {
            return ArrayListFragment.newInstance(position);
        }
    }

    public static class ArrayListFragment extends ListFragment {
        static ArrayListFragment newInstance(int num) {
            ArrayListFragment f = new ArrayListFragment();
            Bundle args = new Bundle();
            args.putInt("num", num);
            f.setArguments(args);
            return f;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mNum = getArguments() != null ? getArguments().getInt("num") : 1;
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.sura_vpager, container, false);

            TextView tv1=(TextView) v.findViewById(R.id.txtHead); 
            tv1.setText("Fragment #" + mNum);

            LL_Head = (LinearLayout)v.findViewById(R.id.LL_Head);

            return v;
        }

请指教 感谢

2 个答案:

答案 0 :(得分:3)

为了获得流畅的体验,ViewPager不仅会加载您当前正在查看的视图,还会加载相邻的视图。这意味着,如果您从位置0滚动到位置1,实际发生的是位置2被加载,因此当您滚动时它将准备就绪。这就是为什么更改应用于“下一个”视图而不是当前视图(如果从视图2滚动到1,则创建视图0)。

由于您在OnCreate中设置了静态LinearLayout,因此它只是要创建的最后一个被更改的视图 - 如果您已滚动到寻呼机的末尾,这将只是您正在查看的视图。相反,您应该跟踪用户正在查看的片段(ViewPager.setOnPageChangeListener())并将片段缓存在适配器中。然后你知道你想要哪个片段位置,当你要求它时,你将只返回你之前创建的那个(不要创建一个新的,然后它将无效:))。

或者,tl; dr版本: LL_Head几乎总是设置为下一个片段,而不是当前片段。不要静态设置它。将其缓存在PagerAdapter中,并在需要时重新设置。

编辑: 或者,您可能希望让片段听取各种事件,告诉他们是否应该显示或隐藏有问题的布局。否则它只会是受此影响的当前片段,而不是所有片段。

答案 1 :(得分:0)

Java中的编号从0开始。因此,当您要设置第5项时,必须调用mPager.setCurrentItem(4);

希望这有帮助!