Я не могу повторно использовать фрагмент в FragmentPagerAdapter .. Используя метод destroyItem (), он удаляет фрагмент, но все еще не вызывает getItem () снова .. Есть всего 2-3 изображения, поэтому я использую FragmentPagerAdapter вместо FragmentStatePagerAdapter ..
public class ExamplePagerAdapter extends FragmentPagerAdapter {
ArrayList < String > urls;
int size = 0;
public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
super(fm);
urls = res;
size = urls.size();
}
@Override
public int getCount() {
if (urls == null) {
return 0;
} else {
return size;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new FloorPlanFragment();
Bundle b = new Bundle();
b.putInt("p", position);
b.putString("image", urls.get(position));
Log.i("image", "" + urls.get(position));
fragment.setArguments(b);
return fragment;
}
}
И в FragmentActivity
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
destroyItem()
? В этом нет необходимости.Ответы:
KISS Ответ:
Просто используйте FragmentStatePagerAdapter вместо FragmentPagerAdapter .
Я получил ответ .. Во - первых , я думал , чтобы удалить этот вопрос , как я делаю очень глупые ошибки , но этот ответ поможет кому - то , кто сталкивается с той же проблемой , что вместо
FragmentPagerAdapter
, использованиеFragmentStatePagerAdapter
.Как отметил @BlackHatSamurai в комментарии:
источник
Использование
FragmentStatePagerAdapter
не полностью решило мою проблему, которая была аналогичной проблемой, когдаonCreateView
не вызывались дочерние фрагменты в пейджере представления. На самом деле я вкладываю себяFragmentPagerAdapter
внутрь другого,Fragment
поэтому онFragmentManager
был общим для всех и, таким образом, сохранял экземпляры старых фрагментов. Исправление заключалось в том, чтобы вместо этого передать экземпляр классаgetChildFragmentManager
конструкторуFragmentPagerAdapter
в моем хост-фрагменте. Что-то вроде...getChildFragmentManager()
Метод доступен через фрагмент и это работает для меня , потому что она возвращает частноеFragmentManager
для этого фрагмента специально для ситуаций , в которых необходимо гнездования фрагменты. Надеюсь, это поможет кому-то, у кого может быть та же проблема, что и у меня !!getChildFragmentManager()
минимальная версия API должна быть как минимум17 (4.2)
, так что это может помешать вам. Конечно, если вы используете фрагменты из библиотеки поддержки v4, все будет в порядке.источник
Override
long getItemId (int position)
FragmentPagerAdapter
кэширует созданные фрагментыgetItem
. Я столкнулся с той же проблемой - даже после того, как звонок мнеnotifyDataSetChanged()
getItem
не звонили.На самом деле это функция, а не ошибка. Вам нужно переопределить,
getItemId
чтобы вы могли правильно повторно использовать свои фрагменты. Поскольку вы удаляете фрагменты, ваши позиции меняются. Как упоминалось в документах:Просто укажите уникальный идентификатор для каждого фрагмента, и все готово.
Использование
FragementStatePagerAdapter
или возвращениеPOSITION_NONE
вint getItemPosition (Object object)
неправильно. Вы не получите кеширования.источник
getItemId
И настроить,getItemPosition
чтобы вернуть,POSITION_NONE
ЕСЛИ фрагмент должен быть удален. Для этого у меня есть флаг enum. После этогоgetItem
будет называться.Я сделал то, что написали @kanika и @ Jraco11, но проблема все еще была.
Итак, после множества изменений я нашел тот, который работал у меня, и в мой FragmentPagerAdapter был добавлен следующий код:
Согласно тому, что я читал, getItemPosition используется для уведомления ViewPager о необходимости обновления элемента и для предотвращения обновлений, если элементы в видимых позициях не изменились.
источник
Есть два разных сценария: 1.) У вас есть одинаковый макет для каждого пейджера: в этом случае будет лучше, если вы расширите свой собственный адаптер с помощью PagerAdapter и вернете один макет.
2.) У вас есть разный макет для каждого пейджера: в этом случае будет лучше, если вы расширите свой собственный адаптер с помощью FragmentStatePagerAdapter и вернете разные фрагменты для каждого пейджера.
источник
метод
getItem()
используется только для создания новых предметов. После их создания этот метод не будет вызываться. Если вам нужно получить предмет, который является валютой, используемой адаптером, используйте этот метод:источник
Я обнаружил, что установка слушателя в раскладке вкладки остановила его вызов, вероятно, потому, что у них есть место только для одного слушателя
tabLayout.setOnTabSelectedListener
вместо массива слушателей.источник