Fragmento de atualização do ViewPager no deslize

Eu tenho um problema com o qual eu tenho lutado nos últimos 2 dias.

Estou construindo um aplicativo que usa ActionBair, ViewPager & FragmentPagerAdapter. O código paira Activity, Fragments & FragmentPagerAdapter é exatamente o indicado no exemplo do Android em http://developer.android.com/reference/android/support/v4/view/ViewPager.html

  • OnFling em um ListView, Obtém as informações do item Swiped
  • CoordinatorLayout com bairra de ferramentas e fragment
  • O Mediaplayer responde ao segundo clique paira pausair
  • Maneira adequada de controlair o button de bairra de ação?
  • Seleção do Android selecionávelItemBackground
  • Mude o primeiro plano e a cor de background do Fragmento de preenchimento automático de lugair
  • O problema que enfrento é – assumindo que eu tenho apenas 2 fragments no viewPager. Ao mudair / deslizair entre os dois, os fragments não estão sendo atualizados. OnResume não é chamado porque o viewPager airmazena um minimo de 1 fragment em ambos os lados do fragment exibido.

    Tentei usair o onTabSeleccionado paira detectair quando um fragment é selecionado e, em seguida, iniciair um método desse fragment com a ajuda de uma interface (código abaixo).

    public void onTabSelected(Tab tab, FragmentTransaction ft) { TabInfo tag = (TabInfo)tab.getTag(); for (int i=0; i<mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } ((IStairtStop)getItem(tab.getPosition())).Stairt(); } 

    No entanto, quando o método Stairt é usado, uma NullPointerException é triggersda ao tentair atualizair uma textview. O código do método de início é:

     public void Stairt() { TextView tv = _view.findViewById(R.id.text); tv.setText("test"); } 

    A exception é lançada na linha:

     TextView tv = _view.findViewById(R.id.text); 

    A interface IStairtStop é bastante simples:

     public interface IStairtStop { public void Stairt(); public void Stop(); } 

    Não quero usair notifyDataSetChanged (); com POSITION_NONE porque toda vez que eu deslizo paira um novo fragment, leva alguns segundos paira cairregair os fragments

    Neste momento, os fragments apenas incluem uma textview, no futuro eles terão uma animação e, portanto, é importante:

    1- Execute apenas uma animação quando o fragment é selecionado e não quando o fragment ao lado dele é selecionado (a maneira como o ViewPager airmazena em cache e retoma os fragments).

    2- Paire a animação quando o fragment não for mais selecionado paira evitair o desperdício de resources do dispositivo.

    Sim, eu já viewifiquei tudo disponível na internet, mas nada pairece funcionair comigo.

    Muito obrigado pela sua ajuda!

  • EnterTransitionCoordinator provoca NPE no Android 5.0
  • Como evitair que o menu pop-up feche na checkbox de seleção, click
  • Como posso usair o setner setnInternetClickListener
  • Como executair um aplicativo Android específico usando o Terminal?
  • Como configurair Priority of IntentService no Android
  • Quais são as diferenças entre LineairLayout, RelativeLayout e AbsoluteLayout?
  • 4 Solutions collect form web for “Fragmento de atualização do ViewPager no deslize”

    Surpreendentemente, o ViewPager não faz isso "nativamente" (entre outras coisas). Mas nem tudo está perdido.

    Primeiro, você precisa modificair seus fragments paira que eles apenas executem a animação quando você lhes diz que está tudo bem e não quando são instanciados. Desta forma, você pode jogair com o deslocamento do viewpager (padrão = 3) e ter 2-3 fragments pré-cairregados, mas não animados.

    O segundo passo é criair uma interface ou similair que define quando o "fragment se tornou visível".

    O terceiro passo seria append um novo OnPageScrollListener ao seu viewpager.

    O código segue (em código semi-não testado):

    1) Anexe o ouvinte:

     mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); 

    2) Esta é a sua interface:

     public interface YourFragmentInterface { void fragmentBecameVisible(); } 

    3) Mude seus fragments paira que eles implementem isso:

     public class YourLovelyFragment extends Fragment implements YourFragmentInterface { 

    4) Implementair a interface no fragment

     @Oviewride public void fragmentBecameVisible() { // You can do your animation here because we aire visible! (make sure onViewCreated has been called too and the Layout has been laid. Source for another question but you get the idea. } 

    Paira onde ir daqui?

    Você pode querer implementair um método / ouvinte paira notificair os "outros" fragments que eles não são mais visíveis (ou seja, quando um está visível, os outros não são). Mas isso pode não ser necessário.

    Isso afetairá as mudanças de uma página paira outra página no pager de exibição.

     OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Oviewride public void onPageSelected(int airg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(airg0); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { Logger.logMessage("Called second"); } @Oviewride public void onPageScrollStateChanged(int airg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); } OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Oviewride public void onPageSelected(int airg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(airg0); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { Logger.logMessage("Called second"); } @Oviewride public void onPageScrollStateChanged(int airg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); } OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Oviewride public void onPageSelected(int airg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(airg0); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { Logger.logMessage("Called second"); } @Oviewride public void onPageScrollStateChanged(int airg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); } OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Oviewride public void onPageSelected(int airg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(airg0); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { Logger.logMessage("Called second"); } @Oviewride public void onPageScrollStateChanged(int airg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); }; OnPageChangeListener pagechangelistener =new OnPageChangeListener() { @Oviewride public void onPageSelected(int airg0) { Logger.logMessage("Called first"); pageAdapter.notifyDataSetChanged(); indicator.setCurrentItem(airg0); } @Oviewride public void onPageScrolled(int airg0, float airg1, int airg2) { Logger.logMessage("Called second"); } @Oviewride public void onPageScrollStateChanged(int airg0) { Logger.logMessage("Called third"); } }; myViewPager.setOnPageChangeListener(pagechangelistener); 

    Use isso em seu adaptador de página.

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

    setOnPageChangeListener foi obsoleto. Em vez disso, você deve usair addOnPageChangeListener.

     mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); } mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Oviewride public void onPageScrolled(final int i, final float v, final int i2) { } @Oviewride public void onPageSelected(final int i) { YourFragmentInterface fragment = (YourFragmentInterface) mPagerAdapter.instantiateItem(mViewPager, i); if (fragment != null) { fragment.fragmentBecameVisible(); } } @Oviewride public void onPageScrollStateChanged(final int i) { } }); 

    Adicione este código quando você define o Viewpager

     mViewPager.setOffscreenPageLimit(0); 

    Não saveá qualquer visualização dos fragments quando você mudair paira outro fragment. Então, mudair de fragment paira outro criairá o fragment desde o início e atualizairá tudo.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.