如何在ViewPager中刷新当前视图

4
我正在使用带有视图V1、V2、V3等的ViewPager,我尝试通过点击按钮来设置每个视图中使用的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个回答

3
为了让ViewPager视图滑动流畅,它不仅会加载当前正在查看的视图,还会加载相邻的视图。也就是说,如果您从位置0滚动到位置1,实际发生的是加载位置2,以便在您继续滚动时准备好。这就是为什么更改应用于“下一个”视图而不是当前视图(如果您从视图2滚动到1,则创建视图0)。
由于您在OnCreate中设置了静态LinearLayout,因此只有最后一个要创建的视图会被更改 - 如果您滚动到pager的末尾,那么这将始终是您正在查看的视图。相反,您应该跟踪用户正在查看哪个片段(ViewPager.setOnPageChangeListener()),并在适配器中缓存片段。然后您知道要获取哪个片段位置,当您请求它时,只需返回先前创建的那个(不要创建新的,否则它将无法工作:))。
简单来说: LL_Head几乎总是设置为下一个片段,而不是当前片段。请勿静态设置。在PagerAdapter中缓存它,并在需要时重新获取它。
编辑: 或者,您可能希望使片段听取某种事件,告诉它们是否应显示或隐藏相关布局。否则,只有当前片段才会受到影响,而不是所有片段。

0
Java中的编号从0开始。因此,当您想设置第5个项目时,必须调用mPager.setCurrentItem(4)。
希望这可以帮助到您!

你没有阅读我上面描述的最后一部分:“……如果我从V6向后退到V5,则会将更改应用于V4”。 - Azam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接