Não consigo reutilizar o fragmento no FragmentPagerAdapter. Usando o método destroyItem (), ele está excluindo o fragmento, mas ainda não chama getItem () novamente. Existem apenas 2-3 imagens, portanto, estou usando o FragmentPagerAdapter em vez do 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;
}
}
E em FragmentActivity,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
destroyItem()
? Isso não é necessário.Respostas:
Resposta do KISS:
Uso simples FragmentStatePagerAdapter em vez de FragmentPagerAdapter .
Eu recebi a resposta .. Primeiro, pensei em excluir esta pergunta, pois estou cometendo um erro muito bobo, mas essa resposta ajudará alguém que está enfrentando o mesmo problema que Em vez de
FragmentPagerAdapter
usarFragmentStatePagerAdapter
.Como @BlackHatSamurai mencionado no comentário:
fonte
O uso de um
FragmentStatePagerAdapter
problema não corrigiu completamente o problema, que era um problema semelhante em queonCreateView
não estava sendo chamado por fragmentos filhos no pager da exibição. Na verdade, estou aninhando meuFragmentPagerAdapter
interior de outro,Fragment
portanto, eleFragmentManager
foi compartilhado em todos eles e, assim, retendo instâncias dos fragmentos antigos. A correção foi alimentar uma instância dogetChildFragmentManager
para o construtor doFragmentPagerAdapter
no meu fragmento de host. Algo como...O
getChildFragmentManager()
método é acessível por meio de um fragmento e isso funcionou para mim porque retorna um particularFragmentManager
para esse fragmento especificamente para situações nas quais é necessário um fragmento de aninhamento. Espero que isso ajude alguém que possa estar tendo o mesmo problema que eu estava !!getChildFragmentManager()
sua versão mínima da API deve ser pelo menos17 (4.2)
, portanto, isso pode gerar uma chave inglesa nas suas marchas. Obviamente, se você estiver usando fragmentos da biblioteca de suporte v4, deverá ficar bem.fonte
Sobrepor
long getItemId (int position)
FragmentPagerAdapter
armazena em cache os fragmentos criados usandogetItem
. Eu estava enfrentando o mesmo problema - mesmo depois de ligarnotifyDataSetChanged()
getItem
não estava sendo chamado.Este é realmente um recurso e não um bug. Você precisa substituir
getItemId
para poder reutilizar corretamente seus fragmentos. Como você está removendo fragmentos, suas posições estão mudando. Conforme mencionado nos documentos:Basta fornecer um ID exclusivo para cada fragmento e pronto.
Usando um
FragementStatePagerAdapter
ou retornandoPOSITION_NONE
emint getItemPosition (Object object)
está errado. Você não receberá nenhum cache.fonte
getItemId
AND ajustargetItemPosition
para retornarPOSITION_NONE
se o fragmento deveria ser removido. Eu tenho uma bandeira enum para isso. Depois dissogetItem
será chamado.Fiz o que @kanika e @ Jraco11 haviam postado, mas ainda tinha o problema.
Então, depois de muitas alterações, encontrei uma que funcionou para mim e foi adicionada ao meu FragmentPagerAdapter o seguinte código:
De acordo com o que li, getItemPosition é usado para notificar o ViewPager sobre a atualização ou não de um item e para evitar atualizações se os itens nas posições visíveis não forem alterados.
fonte
Existem dois cenários diferentes: 1.) Você tem o mesmo layout para cada pager: nesse caso, será melhor se você estender seu adaptador personalizado pelo PagerAdapter e retornar um único layout.
2.) Você tem um layout diferente para cada pager: nesse caso, será melhor se você estender seu adaptador personalizado pelo FragmentStatePagerAdapter e retornar fragmentos diferentes para cada pager.
fonte
O método
getItem()
é usado apenas para criar novos itens. Uma vez criados, esse método não será chamado. Se você precisar obter o item que é moeda em uso pelo adaptador, use este método:fonte
Descobri que a configuração de um ouvinte no layout da guia impediu que isso fosse chamado, provavelmente porque eles só têm espaço para um ouvinte, em
tabLayout.setOnTabSelectedListener
vez de um conjunto de ouvintes.fonte