Impedir que o ViewPager destrua visualizações fora da tela

133

Eu tenho um ViewPager conectado a um FragmentPagerAdapter que exibe três fragmentos. O ViewPager parece destruir a exibição de um fragmento hospedado quando há mais de um deslize da posição atual.

Essas visualizações são todas listas simples e essa otimização é completamente desnecessária, então eu gostaria de desativá-la. Isso está causando alguns problemas visuais porque as listas têm animações de layout aplicadas a elas e essas animações são reproduzidas após serem destruídas e recriadas. Ele também mostra a animação de introdução da barra de rolagem a cada vez (onde a barra de rolagem é brevemente visível para indicar que é possível rolá-la), o que pode ser uma distração e a posição de rolagem atual do usuário é perdida no processo.

Ele também não carrega o terceiro fragmento até que o primeiro furto ocorra, o que é problemático porque cada fragmento lida com suas próprias chamadas de serviço e eu preferiria que os três disparassem ao mesmo tempo quando a atividade carrega. O atraso da terceira chamada de serviço é inferior ao ideal.

Existe alguma maneira de convencer o ViewPager a interromper esse comportamento e apenas manter todos os meus fragmentos na memória?

chefgon
fonte

Respostas:

332

Na revisão 4 do Pacote de Suporte, um método foi adicionado ao ViewPager que permite especificar o número de páginas fora da tela a serem usadas, em vez do padrão que é 1.

No seu caso, você deseja especificar 2, para que, quando estiver na terceira página, a primeira não seja destruída e vice-versa.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
David Snabel-Caunt
fonte
alguma idéia de como fazer isso em um coverflow?
josephus
4
Olá. No que estou trabalhando, os fragmentos / páginas são criados dinamicamente, para que haja um número indefinido de fragmentos prováveis. Nesse caso, geralmente chega a 10 ou menos. Não seria pouco uso de memória usar esta solução em tantas páginas? A propósito, os fragmentos manterão apenas a vista. Obrigado!
Mahkie
Este método gera: "java.lang.IllegalStateException: fragmento já adicionado:" erro para o meu aplicativo.
Alicanbatur
Muito obrigado. Simplesmente funcionou. Eu também tive um mesmo problema como @chefgon.
Prashant
@mahie as soluções acima se for Isto é oferecido como uma otimização. Se você conhece com antecedência o número * de páginas que precisará suportar ou possui mecanismos de carregamento lento * em suas páginas, ajustar essa configuração pode trazer benefícios na suavidade percebida * de animações e interação de paginação. Se você tem um pequeno número de páginas (3-4) * que você pode manter todos os ativos ao mesmo tempo, menos tempo será gasto no layout para * recém-criados subtrees ver como as páginas de usuário de volta e para trás
asthme
8

Por padrão, o ViewPager recria os fragmentos quando você desliza a página. Para evitar isso, você pode tentar uma de duas coisas:

1. No onCreate () de seus fragmentos, chame setRetainInstance (true).

2. Se o número de fragmentos for fixo e relativamente pequeno, adicione onCreate () no código a seguir:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

Se bem me lembro, a segunda opção é mais promissora. Mas peço que tente os dois e veja qual deles funciona.

Pankaj Talaviya
fonte