FragmentPagerAdapter отображает все содержимое фрагмента на первой странице

В памяти у меня есть список элементов, каждый из которых имеет заголовок и список из 0..N фрагментов (которые хранят некоторую информацию). Я знаю, что я правильно создаю этот список в памяти, так как я вывел всю структуру в командную строку.

У меня есть активность, которая использует ViewPager для отображения этих данных. Каждая страница ViewPager является элементом и заполнена фрагментами, которые содержат информацию о каждом фрагменте элемента.

Как я сейчас закодировал, куски для первых двух элементов отображаются на первой странице под первым элементом. Когда страница прокручивается до 2-й страницы, она пуста. Когда страница прокручивается до 3-й страницы (сейчас у меня есть только список из 3 элементов для тестирования), она также показывает пустую страницу, однако, когда страница возвращается на 2-ю страницу, она отображает фрагменты 1-го элемента. . Затем каждый раз, когда происходит переход на 1-ю страницу, а затем на 2-ю, фрагменты 3-й страницы вновь добавляются в существующий список. При наличии перехода со 2-й страницы на 3-ю и обратно в список вновь добавляются чанки из 1-го пункта. Это можно делать до тошноты с постоянно растущим списком. Я понятия не имею, почему он не ведет себя должным образом.

Вот моя основная деятельность (включая FragmentPagerAdapter):

public class MyActivity extends FragmentActivity {
    MyPagerAdapter mPagerAdapter;
    ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Controller.setup();

        mPagerAdapter = new MyPagerAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mPagerAdapter);
    }

    public class MyPagerAdapter extends FragmentPagerAdapter {
        public MyPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            Fragment fragment = new MyFragment();

            Bundle args = new Bundle();
            args.putInt(MyFragment.POSITION, position);
            fragment.setArguments(args);

            return fragment;
        }

        @Override
        public int getCount(){
            return Controller.getAmount();
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return Controller.getItem(position).getTitle();
        }
    }
}

Контроллер очень прост и возвращает информацию именно так, как вы ожидаете. Controller.setup() просто создает список элементов.

Это фрагмент моего предмета:

public class MyFragment extends Fragment {
    public final static String POSITION = "position";
    private int pos;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        pos = getArguments().getInt(POSITION);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_item, container, false);

        Item item = Controller.getItem(pos);
        Iterator<Chunk> chunks = item.getChunks().iterator();
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();

        while(chunks.hasNext()){
            Chunk chunk = chunks.next();
            ChunkFragment entry = new ChunkFragment();

            Bundle args = new Bundle();         
            args.putString(ChunkFragment.INFO_ARG, chunk.getInfo());
            entry.setArguments(args);

            transaction.add(R.id.container, entry);
        }
        transaction.commit();

        return rootView;
    }
}

И, наконец, мой фрагмент Chunk:

public class ChunkFragment extends Fragment {
    public static final String INFO_ARG = "Info";
    private String mInfo;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        Bundle args = getArguments();
        mInfo = args.getString(INFO_ARG);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //setup view
        ViewGroup rootView;

        rootView = (ViewGroup) inflater.inflate(R.layout.fragment_chunk, container, false);

        TextView infoView = (TextView) rootView.findViewById(R.id.info_text);
        infoView.setText(mInfo);

        return rootView;
    }
}

Я знаю, что это много кода, но я не знаю, в чем проблема. Я упростил его до минимума, включив только операции, которые могут быть источником проблемы. Я также не включил свои XML-файлы макета, но они были протестированы и работают нормально.


person Jaws212    schedule 03.04.2013    source источник
comment
Кстати, MyFragment.onCreate() должен проверять, является ли saveInstance нулевым. Содержимое нужно добавить только при первом создании фрагмента. Вот почему я получал дубликаты.   -  person Jaws212    schedule 05.04.2013


Ответы (1)


Я не уверен в этом, но я полагаю, что ваша проблема может быть связана с трудностями создания фрагментов внутри фрагментов в ViewPager.

Вы можете рассмотреть возможность дисквалификации этого как одной из возможностей , следуя рекомендациям по вложению фрагментов.: по сути, это сводится к использованию getChildFragmentManager() для фрагмента, в который вы хотите добавить фрагмент.

Кроме того, вы можете рассмотреть возможность расширения FragmentStatePagerAdapter, что лучше поддерживает состояния фрагментов между их уничтожением и воссозданием.

person Paul Lammertsma    schedule 03.04.2013
comment
Итак, я должен создавать дочерние фрагменты напрямую из PagerAdapter? - person Jaws212; 03.04.2013
comment
Ничего, теперь я понимаю, что происходит. И да, оказывается, вы были совершенно правы. Благодарю вас! - person Jaws212; 03.04.2013
comment
Я тоже ломал голову над вашим вопросом, а потом вдруг вспомнил, что столкнулся с похожей проблемой. Я очень рада, что помогла! - person Paul Lammertsma; 03.04.2013
comment
не работает не отображается изображение после получения ответа во фрагменте"> stackoverflow.com/questions/31476778/ - person Aditya; 18.07.2015