【问题标题】:How to retrieve user data from fragments embedded in viewpager?如何从嵌入在 viewpager 中的片段中检索用户数据?
【发布时间】:2014-06-24 19:08:25
【问题描述】:

我有一个 ViewPager,定义在一个 Activity 中,许多 Fragment 顺序显示在 ViewPager 中。在这些片段中有动态构造的复选框和单选按钮,用户应该对其进行操作。在用户滑动到下一页的那一刻,我需要检索用户数据并将其存储在 Application 对象中。我无法弄清楚这样做的标准方法是什么。由于有很多 Fragment,我选择使用 FragmentStatePagerAdapter。欢迎任何帮助,在此先感谢!

更新 1: 我有这个:

        pageAdapter = new MyPageAdapter(getSupportFragmentManager());
    pager = (ViewPager) findViewById(R.id.viewpager);
    pager.setAdapter(pageAdapter);

    // detects viewpager page change
    pager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            Log.i("TAG", "onPageSelected");
            int index = pager.getCurrentItem();
            MyPageAdapter adapter = ((MyPageAdapter) pager.getAdapter());
            QuestionFragment fragment = (QuestionFragment) adapter.getItem(position);
            if (fragment.rdbtn != null) {
                for (int i = 0; i < fragment.rdbtn.length; i++) {
                    if (fragment.rdbtn[i].isChecked())
                        Log.i("TAG", "checked");
                    else
                        Log.i("TAG", "not checked");
                } 
            }
            // fragment.refresh();
        }
    });

检查调试器时,在启动后,ViewPager 会实例化片段 0 和 1(标准行为)。当用户操作 fragment-0 并滑动时,确实调用了处理程序,但位置 = 1,而不是 0。我要读取的公共元素为 null!

UPDATE-2

我在调试器中注意到我需要的数据存储在 adapter.mCurrentPrimaryItem 中。 如何在代码中检索 CurrentPrimaryItem?!

【问题讨论】:

    标签: android android-fragments android-viewpager fragmentstatepageradapter


    【解决方案1】:

    您可以在您的活动中实现pageChangeListener 并将其设置为viewPager。 然后,您可以拥有一个class abstract BaseFragment extends Fragment 并声明一个抽象方法,例如 getData(),ViewPager 中的每个片段都扩展并覆盖该方法。 在活动的 onPageSelected() 中,您可以访问这些数据。

    【讨论】:

    • PS:一件有趣的事情是处理用户来回滑动的情况..
    • 您好 Abhishek,我更新了问题。我基本上已经做了你推荐的,虽然没有子类,只是公共成员。等等,我调用了 getItem,它实例化了一个新片段!当然,成员是空的。那么如何在不通过 getItem 实例化的情况下访问片段呢?
    • 最简单的 hack 是,在 FragmentPagerAdapter 中创建一个长度为 adapter.getCount() 的片段数组,并在执行 getItem() 的同时填充数组。并在活动中,通过相应的位置访问该数组中的片段。
    • 我明白,但我不确定这是否是官方的方式。而且我有大量的 Fragment,所以我想使用适配器 FragmentStatePagerAdapter,专门设计用于最小化内存影响。我不确定这个提议的“hack”是否与 FragmentStatePagerAdapter 的设计理念相矛盾。
    猜你喜欢
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多