3

Итак, я пытаюсь использовать ViewPager из библиотеки поддержки Android v4, но есть некоторые серьезные проблемы с тем, как это (или FragmentPagerAdapter) имеет дело с фрагментами. Например, я подклассы FragmentPagerAdapter сделать следующее:Как бороться с FragmentPagerAdapter, повторно использующим фрагменты?

public class MyPagerAdapter extends FragmentPagerAdapter 
{ 
private ArrayList<Fragment> fragments = null; 
private ArrayList<Data> data = null; 

public MyPagerAdapter(FragmentManager fragmentManager, ArrayList<Data> data) 
{ 
    super(fragmentManager); 

    this.data = data; 

    fragments = new ArrayList<Fragment>(); 

    for(Data datum : data) 
    { 
     MyDataFragment fragment = new MyDataFragment(); 
     fragment.setData(datum); 
     fragments.add(fragment); 
    } 
} 

@Override 
public Fragment getItem(int i) 
{ 
    return fragments.get(i); 
} 

@Override 
public int getCount() 
{ 
    return fragments.size(); 
} 
} 

Теперь, я думал, что это было бы достаточно, и что я мог бы пойти дальше и реализовать MyDataFragment с использованием метода onCreateView, что фрагменты, как правило, реализации. Но у меня возникла интересная проблема. Когда я перейду от Activity, а затем вернусь к нему, ViewPager появится пустым. Каким-то образом это было повторное использование фрагментов, вызвав findFragmentByTag, а затем просто не вызвав getItem и т. Д. Что еще хуже, Фрагмент не получит никакого события onCreateView. Поэтому я решил, что могу использовать кэширование фрагмента ViewPager, переместив код onCreateView, который в основном захватывает ссылки на различные виды фрагмента, раздуваемые, до onAttach. Единственная проблема заключается в том, что во время onAttach метод MyDataFragment getView всегда возвращает значение null. Все примеры для Fragments online описывают, что onCreateView должен иметь весь ваш код настройки. Хорошо. Но тогда, когда я создаю такой метод, как MyDataFragment.setSomeField(String value), мне нужно использовать ссылку на TextView. Поскольку onCreateView не всегда вызывается (например, когда фрагменты магически перерабатываются FragmentPagerAdapter, например), лучше взять эту ссылку в onAttach. Однако во время onAttach корневой вид фрагмента по-прежнему равен нулю (вероятно, потому, что onCreateView не был вызван в первую очередь)! После этого никаких дополнительных событий не происходит (за исключением onActivityCreated, что не имеет ничего общего с самим фрагментом), поэтому нет необходимости делать установочный код. Как это должно работать? Я пропустил что-то важное здесь, или была система Фрагмента, разработанная обезьяной?

ответ

1

Я не уверен, что это правильный вариант использования FragmentPagerAdapter (это похоже на то, что вы хотели бы сделать с помощью ListAdapter).

Из FragmentPagerAdapter документов:

Реализация PagerAdapter, которая представляет каждую страницу как фрагмент , который постоянно хранятся в менеджере фрагмента до тех пор, как пользователь может вернуться на страницу.

Эта версия пейджера лучше всего подходит для использования, когда есть несколько обычно более статических фрагментов быть пролистал, такие как набор вкладок. Фрагмент каждой страницы, которую посещает пользователь, будет храниться в памяти , хотя его иерархия представлений может быть уничтожена, если ее не видно. Это может привести к использованию значительного объема памяти, так как фрагменты экземпляров могут содержать произвольное количество состояний. Для более крупных наборов страниц рассмотрим FragmentStatePagerAdapter.

Я бы предпочел переключиться на FragmentStatePagerAdapter или, возможно, на ListAdapter. Если вы хотите, чтобы createView был вызван, его нужно будет воссоздавать каждый раз (уничтожить старый фрагмент и создать новые), но опять же я не думаю, что это совсем то, что вы хотите.

Смежные вопросы