#android #android-fragments #android-viewpager #adapter
#Android #android-фрагменты #android-viewpager #адаптер
Вопрос:
У меня есть ViewPager (родительский ViewPager) в моей деятельности с 4 фрагментами. Один из фрагментов реализует скользящий ViewPager (Дочерний ViewPager) с автоматическим скольжением.
Когда я провожу родительский ViewPager, скажем, на вкладку 3, а затем возвращаюсь к первому фрагменту, который содержит скользящий ViewPager, часть слайда исчезает, а часть остается. Когда я пару раз перемещаю ViewPager (дочерний ViewPager) взад и вперед, он восстанавливается в исходное состояние.
Я предполагаю, что состояние фрагмента пейджера скользящего просмотра теряется при перемещении родительского ViewPager.
Вот адаптер родительского ViewPager:
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
Вот адаптер дочернего ViewPager (слайдер):
class sliding_PageAdapters extends FragmentPagerAdapter {
int mNumOfTabs;
public sliding_PageAdapters(FragmentManager fm, int numTabs) {
super(fm);
this.mNumOfTabs = numTabs;
}
@Override
public void destroyItem(ViewGroup viewPager, int position, Object object) {
viewPager.removeView((View) object);
}
@Override
public Fragment getItem(int position) {
Bundle ar = new Bundle();
FragmentHomeImages fragment = new FragmentHomeImages();
switch (position) {
case 0:
ar.putString("number", "0");
fragment.setArguments(ar);
return fragment;
case 1:
ar.putString("number", "1");
fragment.setArguments(ar);
return fragment;
case 2:
ar.putString("number", "2");
fragment.setArguments(ar);
return fragment;
case 3:
ar.putString("number", "3");
fragment.setArguments(ar);
return fragment;
default:
return null;
}
}
@Override
public int getCount() {
return mNumOfTabs;
}
}
Вызывается дочерний ViewPager с getChildFragmentManager()
помощью here:
sliding_pagerAdapter = new sliding_PageAdapters(getChildFragmentManager(), 4);
И родительский ViewPager вызывается с getSupportFragmentManager()
помощью here:
adapter = new ViewPagerAdapter(getSupportFragmentManager());
Ответ №1:
Я могу придумать одну проблему. На родительском viewpager вызывается setOffscreenPageLimit(ограничение).
здесь limit — это количество страниц, которые должны быть сохранены по обе стороны от текущей страницы в иерархии представлений в состоянии ожидания. Страницы, превышающие этот предел, будут воссозданы из адаптера при необходимости. Поэтому установите соответствующий предел в зависимости от вашего варианта использования.
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(new MyAdapter(fragmentManager));
viewPager.setOffscreenPageLimit(2);