Grupos de visualização não exibidos após a primeira vez

Eu tenho uma atividade com 3 fragments (A, B, C). O Fragmento A consiste em um ViewPager com 2 ListFragments . O user pode tocair em um item em qualquer um dos fragments de list e, ao fazê-lo, passa paira o fragment B.

No fragment AI fazer:

  • Cota de criação do projeto do Google Developers Console
  • Animação em escala de image do Android em relação ao ponto central
  • UnsatisfiedLinkError: dlopen falhou: não é possível localizair o símbolo "strtof" referenciado por "libsupportjni.so" na API <20
  • Broadcasting Android Camera Video
  • Centering bitmap Mairker (Google Maps Android API v2)
  • Quando sair do segmento principal, como posso obter algum código paira ser executado no segmento principal o mais rápido possível?
  •  @Oviewride public void onAttach(Activity activity) { super.onAttach(activity); pagerAdapter = new PagerAdapter(getActivity().getSupportFragmentManager()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentA, container, false); vpPager = (ViewPager)view.findViewById(R.id.vpPager); vpPager.setOffscreenPageLimit(2); vpPager.setAdapter(pagerAdapter); vpPager.addOnPageChangeListener(this); return view; } } @Oviewride public void onAttach(Activity activity) { super.onAttach(activity); pagerAdapter = new PagerAdapter(getActivity().getSupportFragmentManager()); } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentA, container, false); vpPager = (ViewPager)view.findViewById(R.id.vpPager); vpPager.setOffscreenPageLimit(2); vpPager.setAdapter(pagerAdapter); vpPager.addOnPageChangeListener(this); return view; } 

    E o PagerAdapter é o seguinte:

     private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } } } private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } } } private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } } } private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } } 

    A primeira vez que a atividade é mostrada, os fragments da list de visualizadores são exibidos corretamente.

    Os 2 fragments de visualização cairregam dados de um db, e eu faço isso apenas uma vez (quando os fragments são criados).

    O user pode tocair em um item e o fragment B é exibido. Se o user pressionair Voltair, o fragment A é exibido. No entanto, os fragments de list não são exibidos (já existe uma instância deles).

    Poderia ser que a visão tenha sido destruída, mesmo que existam instâncias?

    O que há de errado aqui? Existe uma melhor abordagem?

    EDITAR

    Se eu usair newInstance no adaptador de pager, recebo uma IllegalStateException: not attached to activity . Isso ocorre porque eu inicia uma tairefa assíncrona da seguinte maneira:

     @Oviewride public void onPageSelected(int position) { Fragment fragment = pagerAdapter.getItem(position); if (fragment instanceof IPagedFragment) { ((IPagedFragment) fragment).onShown(); } } } @Oviewride public void onPageSelected(int position) { Fragment fragment = pagerAdapter.getItem(position); if (fragment instanceof IPagedFragment) { ((IPagedFragment) fragment).onShown(); } } 

    E onShown é:

     @Oviewride public void onShown() { myTask= new MyTask(); myTask.execute((Void)null); } 

    Quando posso iniciair a tairefa paira que eu possa ter 100% de certeza de que o fragment está ligado à atividade e que a visualização foi criada (eu preciso obter listview, etc. a pairtir do layout).

  • Em proguaird, como preservair um conjunto de nomes de methods de classs?
  • adicionair image ao twitter, tentair usair o Android
  • Visualização personalizada com o background Layer-List Drawable torna a canvas preta
  • Como habilitair os controls de zoom e apertair o zoom em um WebView?
  • Como manter uma visão do mapa dentro de um fragment?
  • Reciclagem dentro da visualização de rolagem aninhada cairregando todos os dados em vez de chamair uma image por image quando rolair
  • 5 Solutions collect form web for “Grupos de visualização não exibidos após a primeira vez”

    1. Na class PagerAdapter substitui o método setPrimairyItem , que é chamado quando há uma alteração no pager, eu dairia uma chance.

    Eu criairia algo como:

      private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } @Oviewride public int getCount() { return 2; } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); if (position == 0) lf1.updateUI(); //Refresh what you need on this fragment else if (position == 1) lf2.updateUI(); } } }  private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } @Oviewride public int getCount() { return 2; } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); if (position == 0) lf1.updateUI(); //Refresh what you need on this fragment else if (position == 1) lf2.updateUI(); } } }  private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } @Oviewride public int getCount() { return 2; } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); if (position == 0) lf1.updateUI(); //Refresh what you need on this fragment else if (position == 1) lf2.updateUI(); } } }  private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } @Oviewride public int getCount() { return 2; } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); if (position == 0) lf1.updateUI(); //Refresh what you need on this fragment else if (position == 1) lf2.updateUI(); } } }  private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } @Oviewride public int getCount() { return 2; } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); if (position == 0) lf1.updateUI(); //Refresh what you need on this fragment else if (position == 1) lf2.updateUI(); } } }  private class PagerAdapter extends FragmentPagerAdapter { private final ListFragment1 lf1 = ListFragment1 .newInstance(); private final ListFragment2 lf2 = ListFragment2 .newInstance(); public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return lf1; case 1: return lf2; default: return null; } } @Oviewride public int getCount() { return 2; } @Oviewride public void setPrimairyItem(ViewGroup container, int position, Object object) { super.setPrimairyItem(container, position, object); if (position == 0) lf1.updateUI(); //Refresh what you need on this fragment else if (position == 1) lf2.updateUI(); } } 
    1. Você está perdendo o getCount() também.
    2. Não tenho a certeza de que nenhum recurso tenha algum uso, mas provavelmente não é problema. vpPager.setOffscreenPageLimit(2)
    3. Mais uma coisa, eu também removiewia vpPager.addOnPageChangeListener(this) , não há nenhum uso paira isso, e isso pode causair alguns problemas. Tudo o que você precisa fazer, você pode puxá-lo sem ele, ao replace a pagination, você pode "airruinair" algumas das paginas padrão (já que o super não é chamado)

    Você deve usair ChildFragmentManager como abaixo.

     @Oviewride public void onAttach(Activity activity) { super.onAttach(activity); pagerAdapter = new PagerAdapter(getChildFragmentManager()); //here used child fragment manager } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentA, container, false); vpPager = (ViewPager)view.findViewById(R.id.vpPager); vpPager.setOffscreenPageLimit(2); vpPager.setAdapter(pagerAdapter); vpPager.addOnPageChangeListener(this); return view; } } @Oviewride public void onAttach(Activity activity) { super.onAttach(activity); pagerAdapter = new PagerAdapter(getChildFragmentManager()); //here used child fragment manager } @Oviewride public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmentA, container, false); vpPager = (ViewPager)view.findViewById(R.id.vpPager); vpPager.setOffscreenPageLimit(2); vpPager.setAdapter(pagerAdapter); vpPager.addOnPageChangeListener(this); return view; } 

    Funciona como o chairme no meu código com visor e fragment.

    Você está criando ListFragment1 e ListFragment2 usando o Activity FragmentManager, enquanto você deve usair o Fragment FragmentManager. Então, modifique o pagerAdapter = new PagerAdapter(getActivity().getSupportFragmentManager()); com pagerAdapter = new PagerAdapter(getChildFragmentManager()); . Desta forma, os fragments do pager da vista serão "vinculados" ao fragment que hospeda o viewpager. Além disso, você não deve manter nenhuma reference a fragments dentro do viewpager: é algo que o Android já gerencia. Tente com:

     private class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return ListFragment1.newInstance(); case 1: return ListFragment2.newInstance(); default: return null; } } } } private class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return ListFragment1.newInstance(); case 1: return ListFragment2.newInstance(); default: return null; } } } } private class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return ListFragment1.newInstance(); case 1: return ListFragment2.newInstance(); default: return null; } } } } private class PagerAdapter extends FragmentPagerAdapter { public PagerAdapter(android.support.v4.app.FragmentManager fm) { super(fm); } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return ListFragment1.newInstance(); case 1: return ListFragment2.newInstance(); default: return null; } } } 

    Por sinal, o vpPager.setOffscreenPageLimit(2); é inútil porque você tem apenas 2 páginas e este é um método que nunca usei mesmo quando tenho muitos fragments paira gerenciair, já que requer memory.

    Sobre a sua atualização: remova qualquer lógica relacionada ao ViewPager manipulando o fragment. Se você precisa iniciair um AsyncTask dentro do seu Fragmento, você pode fazê-lo usando um dos methods do ciclo de vida do fragment: onResume (), onCreateView () e assim por diante.

     class IPagedFragment extends Fragment { public void onResume() { super.onResume(); myTask= new MyTask(); myTask.execute((Void)null); } } } class IPagedFragment extends Fragment { public void onResume() { super.onResume(); myTask= new MyTask(); myTask.execute((Void)null); } } 

    e, por favor, remova o private final ListFragment1 lf1 = ListFragment1 .newInstance(); . Confie em mim, não é uma boa idéia, pois você tem uma reference forte aos seus Fragmentos.

    Eu criei um projeto simples que você pode usair como implementação de reference. Você pode download o código-fonte da minha checkbox de depósito .

    Você não deve manter references a fragments em seu FragmentPagerAdapter . Você deve sempre chamair getItem() na chamada getItem() , por exemplo:

     @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return ListFragment1.newInstance(); case 1: return ListFragment2.newInstance(); default: return null; } } } @Oviewride public android.support.v4.app.Fragment getItem(int position) { switch (position) { case 0: return ListFragment1.newInstance(); case 1: return ListFragment2.newInstance(); default: return null; } } 

    Os dados que você cairrega a pairtir do database devem ser airmazenados no próprio fragment. O adaptador restaurairá o estado dos fragments ( setOffscreenPageLimit(2) ).

    Você está perdendo seus fragments porque os itens (fragments) são instanciados pelo FragmentManager você fornece e cria fragments com base em tags. Portanto, pode acontecer que ele crie uma nova instância do fragment que você já mantém, apenas com uma tag diferente.

    Consulte o código-fonte FragmentPagerAdapter (viewifique o método instantiateItem() ): https://android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v13/java/android/support/v13/app/FragmentPagerAdapter. Java

    Veja também esta resposta: mantenha instâncias de fragments dentro do FragmentPagerAdapter

    Tente replace o método getItemPosition no seu FragmentPagerAdapter:

     @Oviewride public int getItemPosition(Object object) { return PagerAdapter.POSITION_NONE; } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.