2015-03-27 3 views
2

Мой контекстПочему ViewPager сохраняет текущую страницу, даже новый экземпляр был создан?

Предположим, у меня есть Fragment содержат ViewPager, которые имеют 3 страниц (фрагмент). Мой onCreateView метод:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.main_tv_fragment, null); 
     listFragment = new ArrayList<>(); 
     listFragment.add(new EventFragment()); 
     listFragment.add(new ChannelFragment()); 
     listFragment.add(new FavoriteFragment()); 
     viewPager = (ViewPager) rootView.findViewById(R.id.viewpager); 
     fragmentPagerAdapter = new MainLiveTVtAdapter(
       getChildFragmentManager(), listFragment); 

     slidingTabLayout = (SlidingTabLayout) rootView.findViewById(R.id.sliding_tabs); 
     // Center the tabs in the layout 
     slidingTabLayout.setDistributeEvenly(true); 
     slidingTabLayout.setCustomTabColorizer(null); 
     try { 
      viewPager.setAdapter(fragmentPagerAdapter); 
     } catch (Exception ex) { 
      ex.getMessage(); 
     } 
     slidingTabLayout.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
      @Override 
      public int getIndicatorColor(int position) { 
       return getActivity().getResources().getColor(R.color.action_bar_bg); 
      } 
     }); 
     slidingTabLayout.setViewPager(viewPager); 
     viewPager.setOffscreenPageLimit(5); 
     viewPager.setAdapter(fragmentPagerAdapter); 
     slidingTabLayout.setViewPager(viewPager); 
     viewPager.setCurrentItem(page, false); 
     return rootView; 
    } 

Я назвал viewPager.setCurrentItem(page, false); установить текущую страницу в ViewPager, предположим, что page = 1 означает вторую страницу. Когда фрагмент отображается в окне, отображается вторая страница, я прокручиваю ViewPager на третью страницу, а затем заменяю этот фрагмент на другой. После этого я воссоздаю этот фрагмент и принесу его, но ViewPager все еще показывал третью страницу, даже viewPager.setCurrentItem(page, false); был вызван с page = 1.

Как вы можете видеть выше, ViewPager был создан новый экземпляр, а также Adapter.

Может ли кто-нибудь объяснить, почему это произошло? И как я могу это исправить?

EDIT

Существует мой Adapter для ViewPager

public class MainLiveTVtAdapter extends FragmentStatePagerAdapter { 
    private List<Fragment> fragments; 
    private String[] title = {"Sự kiện", "Kênh","Yêu thích"}; 
    FragmentManager fm; 
    public MainLiveTVtAdapter(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     this.fm=fm; 
     this.fragments = fragments; 
    } 

    @Override 

    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

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

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return title[position]; 
    } 

// @Override 
// public void destroyItem(ViewGroup container, int position, Object object) { 
//  if (position >= getCount()) fm.beginTransaction().remove((Fragment) object).commit(); 
// } 
} 
+0

мочь добавить код для 'MainLiveTVtAdapter' – royB

+0

@ mr.icetea Что вы подразумеваете под этим не сохраняет его состояние? – Hades

+0

Отъезд: http://www.truiton.com/2013/05/android-fragmentstatepageradapter-example/ –

ответ

1

Это как платформа предназначена. Он пытается сохранить состояние представлений, которые имеют идентификаторы, когда активность/фрагмент воссоздается. Позиция ViewPager сохраняется так же, как и содержимое EditText. Если вы хотите, чтобы избавиться от этого - есть несколько способов:

  • переопределение onSaveInstanceState и вызвать viewPager.setCurrentItem() с индексом вашего выбора,
  • переопределение onSaveInstanceState и вызвать viewPager.setAdapter (нуль),
  • переопределение onRestoreInstanceState и вызвать viewPager.setCurrentItem() с индексом вашего выбора

есть, вероятно, и другие способы тоже, но, как правило, разработчики отлично с поведением по умолчанию, сохраняющего состояние.

Обратите внимание, что текущий элемент будет тем, который вы установили в onCreate, если фрагмент/активность недавно добавлен и не воссоздан (savedInstanceState равно null).

+0

Okie я попробую –

+0

'onSaveInstanceState' не вызывается, когда я заменил его другим фрагментом. И не существует 'onRestoreInstanceState' во фрагменте :( –

+0

Я нашел метод' onDestroyView', который был вызван при замене фрагментов. Я помещал 'viewPager.setCurrentItem()' внутри этого метода и перед 'супер-вызовом', но он все еще не делал –

1

Если вы хотите делать какие-либо динамические материалы с помощью вашего пейджера, вы должны реализовать его вот так: Retrieve a Fragment from a ViewPager В противном случае это будет вести себя странно.

0

Это: viewPager.setOffscreenPageLimit(5); Почему ViewPager сохраняет экземпляры. doc говорит:

Установить количество страниц, которые должны быть сохранены в обе стороны от текущей страницы в иерархии представлений в нерабочем состоянии. Страницы за пределами этого диапазона предел будет воссоздан из адаптера, если это необходимо.

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