Os fragmentos que uso em minha ViewPager
instância consomem muitos recursos, portanto, gostaria de carregar apenas um de cada vez. Quando tento o seguinte:
mViewPager.setOffscreenPageLimit(0);
mViewPager.setAdapter(mPagerAdapter);
Minha FragmentStatePagerAdapter.getItem(int position)
função de substituição é chamada 3 vezes, que é o que acontece quando eu chamo mViewPager.setOffscreenPageLimit(1)
. Eu esperaria que ele fosse chamado apenas uma vez, porque eu especifiquei 0 páginas fora da tela.
Acredito que estou chamando tudo corretamente, pois se eu ligar mViewPager.setOffscreenPageLimit(2)
, FragmentStatePagerAdapter.getItem(int position)
é chamado 5 vezes como eu esperava.
O ViewPager requer no mínimo 1 página fora da tela ou estou fazendo algo errado aqui?
android
android-viewpager
android-support-library
Chris Lacy
fonte
fonte
ViewPager.setOffscreenPageLimit(2)
funcionava para mim. TenteViewPager.setOffscreenPageLimit(totTabs - 1)
Respostas:
Sim. Se estou lendo o código-fonte corretamente, você deve receber um aviso sobre isso no LogCat, algo como:
fonte
ViewPager
.ViewPager
cria esses fragmentos para que as visualizações existam, de modo que o usuário possa deslizar entre eles, com o efeito animado mostrando a visualização antiga deslizando para fora da tela e a nova deslizando para a tela. Sinta-se à vontade para tentar escrever o seu próprio,ViewPager
que pode deslizar entre coisas que não existem. Você pode ler mais sobre isso em code.google.com/p/android/issues/detail?id=56667#c3setOffscreenPageLimit(0)
de 0. Então, posso lidar com as consequências sozinho. Um fragmento vazio padrão pode ser um espaço reservado, por exemplo, até que o fragmento seja carregado. Tudo isso poderia ocorrer fora do thread da IU. De qualquer forma, não pensei muito nisso.ViewPager
, um que você substitui pelo conteúdo real quando disponível .A melhor maneira que encontrei foi setUserVisibleHint
adicionar isso ao seu fragmento
fonte
Você pode tentar assim:
fonte
Primeiro Adicionar
do que
fonte
ViewPager é o padrão para carregar a próxima página (Fragmento) que você não pode alterar por setOffscreenPageLimit (0). Mas você pode fazer algo para hackear. Você pode implementar a função onPageSelected em Activity contendo o ViewPager. No próximo Fragment (que você não deseja carregar), você escreve uma função, digamos showViewContent (), onde você insere todo o código init de consumo de recursos e não faz nada antes do método onResume (). Em seguida, chame a função showViewContent () dentro de onPageSelected. Espero que isso ajude.
fonte
este pode ser um tópico antigo, mas parece funcionar para mim. Substitua esta função:
felizes codificações ...
fonte
no meu caso, eu queria iniciar algumas animações em visualizações, mas com setUserVisibleHint tive alguns problemas ...
minha solução é:
1 / addOnPageChangeListener para o seu adaptador:
2 / implementar OnPageChangeListener:
3 / substituir os 3 métodos:
4 / declare e inicialize esta variável em sua classe
aviso : eu tenho três fragmentos em meu adaptador e uso mTabState para setCurrentItem e a posição atual do adaptador que reconhece qual fragmento é mostrado ao usuário a tempo ... 5 / no método onPageSelected adicione estes códigos:
se a página anterior ou a página atual for a página 0 (fragmento na posição 0), faça isso
6 / agora em sua classe de fragmento (fragmento na posição 0 do adaptador), você deve criar broadcast receiver e registrá-lo no método onResume e cancelar o registro onPause methos:
resumo: eu tenho Fragment Pager Adapter que mostra três fragmentos nele, eu quero mostrar algumas animações em Views em Fragment na posição 0 do Adapter, para isso eu uso BroadcastReceiver. Quando o fragmento é selecionado, eu inicio o método de animação e mostro as visualizações para o usuário, quando o fragmento não está sendo exibido para o usuário, tento visualizar as visualizações ...
fonte
Tente este código para resolver o problema de atualização da visualização no Viewpager ....
fonte
para a função "instantiateItem", apenas prepare o fragmento, mas não carregue o conteúdo pesado.
Use "onPageChangeListener", para que cada vez que você vá para uma página específica, você carregue seu conteúdo pesado e o mostre.
fonte
Eu meio que tenho o mesmo problema. Encontrei algum código útil neste site e o transformei.
O mínimo int para mViewPager.setOffscreenPageLimit (...); é 1, então, mesmo se você alterá-lo para 0, ainda terá 2 páginas carregadas.
A primeira coisa a fazer é criar um int estático que chamaremos maxPageCount e substituiremos o método getCount () de FragmentStatePagerAdapter para retornar maxPageCount:
Crie então um método estático acessível de qualquer lugar no programa que permitirá que você altere este maxCount:
Agora inicialize maxPageCount como 1. Sempre que quiser, você pode adicionar outra página. No meu caso quando precisei que o usuário tratasse a página atual primeiro antes de gerar a outra. Ele faz isso e então, sem problemas, pode passar para a próxima página.
Espero que ajude alguém.
fonte
Use // crie um booleano para buscar dados private boolean isViewShown = false;
fonte