Как получить пользовательские данные из фрагментов, встроенных в viewpager?

У меня есть ViewPager, определенный в Activity, и множество фрагментов, последовательно отображаемых в ViewPager. В этих фрагментах есть динамически конструируемые чекбоксы и радиокнопки, которыми должен манипулировать пользователь. В тот самый момент, когда пользователь переходит на следующую страницу, мне нужно, чтобы пользовательские данные были извлечены и сохранены в объекте приложения. Я не могу понять, что такое стандартный способ сделать это. Поскольку фрагментов много, я решил использовать 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 (стандартное поведение). Когда пользователь манипулирует фрагментом-0 и проводит пальцем, обработчик действительно вызывается, но с position=1, а не 0. И общедоступные элементы, которые я хочу прочитать, равны нулю!

ОБНОВЛЕНИЕ 2

Я замечаю в отладчике, что нужные мне данные хранятся в adapter.mCurrentPrimaryItem. Как получить CurrentPrimaryItem в коде?!


person jhulst    schedule 24.06.2014    source источник


Ответы (1)


Вы можете реализовать pageChangeListener в своей деятельности и установить для этого viewPager. Затем вы можете иметь class abstract BaseFragment extends Fragment и объявить абстрактный метод, скажем, getData(), который каждый фрагмент в ViewPager расширяет и переопределяет метод. И в onPageSelected() действия вы можете получить доступ к этим данным.

person Abhishek Shukla    schedule 24.06.2014
comment
PS: одна интересная вещь - обрабатывать случай, когда пользователь проводит пальцем вперед и назад. - person Abhishek Shukla; 24.06.2014
comment
Привет Абхишек, я обновил вопрос. Я в основном уже сделал то, что вы рекомендовали, хотя и без подкласса, только с открытыми членами. Ой, подождите, я вызвал getItem, который создает новый фрагмент! Конечно, члены нулевые. Итак, как мне получить доступ к фрагменту, не создавая его экземпляр через getItem? - person jhulst; 24.06.2014
comment
Самый простой способ — создать массив фрагментов внутри FragmentPagerAdapter длины adapter.getCount() и заполнить массив при выполнении getItem(). И в действии получите доступ к фрагменту из этого массива по соответствующей позиции. - person Abhishek Shukla; 24.06.2014
comment
Я это понимаю, но не уверен, что это официальный способ. Кроме того, у меня большое количество фрагментов, поэтому я хотел использовать адаптер FragmentStatePagerAdapter, специально разработанный для минимизации воздействия на память. Я не уверен, что этот предложенный «хак» противоречит философии дизайна FragmentStatePagerAdapter. - person jhulst; 24.06.2014