2013-12-11 3 views
0

Я пытаюсь заменить фрагменты из моего адаптера ViewPager, но он не работает. Ошибок нет. Когда я вызываю метод replace (int, Fragment), он ничего не делает. У вас есть какие-то подсказки, почему это не работает?Замена фрагментов ViewPager

public class PagerAdapter extends FragmentPagerAdapter { 
    private Vector<Fragment> mFragments; 
    private Stack<Fragment> mHiddenFragments; 
    public PagerAdapter(FragmentManager fm) { 
     super(fm); 
     mFragments = new Vector<Fragment>(); 
     mHiddenFragments = new Stack<Fragment>(); 
    } 
// here is the replacement method I'm using 
    public void replace(int index, Fragment fragment) { 
     mHiddenFragments.push(mFragments.get(index)); 
     mFragments.set(index, fragment); 
     notifyDataSetChanged(); 
    } 
    public void replace(int index) { 
     mFragments.set(index, mHiddenFragments.pop()); 
     notifyDataSetChanged(); 
    } 
    public void add(Fragment fragment) { 
     mFragments.add(fragment); 
     notifyDataSetChanged(); 
    public void remove(int index) { 
     mFragments.remove(index); 
     notifyDataSetChanged(); 
    } 
} 

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

пример: Предположим, что у меня есть фрагменты 0 & 1 => mFragments.size() == 2

mPagerAdapter.add(new GenreListFragment()); 
mPagerAdapter.remove(1); 

ответ

1

Мой любимый решение использует причину вложенных фрагментов», что дает мне полный контроль над ними.

Вы также могли бы проверить Replace Fragment inside a ViewPager

Edit. Вы также можете реализовать абстрактный метод PagerAdapter, когда вы получаете вызов notifyDataSetChanged().

@Override 
public int getItemPosition(Object object) { 
return POSITION_NONE; 
} 

С уважением.

+0

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

+0

Но если вы хотите иметь несколько фрагментов на странице, вы можете создать «пустой» фрагмент контейнера, используемый в адаптере пейджера, а затем добавить дочерние элементы к этим «базовым» фрагментам. –

+0

Я уже успел добавить несколько фрагментов на страницу, однако оказалось, что это не то решение, которое я ищу. – mewa

1

Хорошо, я наконец-то знаю, как это исправить. Я изменил свой PagerAdapter, чтобы расширить FragmentStatePagerAdapter вместо FragmentPagerAdapter, и только после этого, когда я переделал getItemPosition, я начал работать правильно, и мои фрагменты были заменены правильно.

@Override 
    public int getItemPosition(Object object) { 
    return POSITION_NONE; 
} 

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

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