【问题标题】:How to refresh current view in ViewPager如何在 ViewPager 中刷新当前视图
【发布时间】:2011-12-26 10:12:49
【问题描述】:

我正在使用带有视图 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;
        }

请指教 谢谢

【问题讨论】:

    标签: android android-viewpager


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      Java 中的编号是从 0 开始的,所以当你想设置第 5 项时,你必须调用 mPager.setCurrentItem(4);

      希望这会有所帮助!

      【讨论】:

      • 您没有阅读我上面描述的最后一部分:“....如果我要从 V6 倒退到 V5,那么它会在 V4 上应用更改”
      猜你喜欢
      • 2016-08-31
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多