ViewPager'in ekran dışı görünümleri yok etmesini önleme


133

Üç parça gösteren bir FragmentPagerAdapter bağladım bir ViewPager var. ViewPager, geçerli konumdan birden fazla hızlıca kaydırıldığında barındırılan bir parçanın görünümünü yok ediyor gibi görünüyor.

Bu görünümlerin hepsi basit listelerdir ve bu optimizasyon tamamen gereksizdir, bu yüzden devre dışı bırakmak istiyorum. Bazı görsel sorunlara neden oluyor çünkü listelerde kendilerine uygulanan düzen animasyonları var ve bu animasyonlar yok edildikten ve yeniden oluşturulduktan sonra tekrar oynatılıyor. Ayrıca, her seferinde kaydırma çubuğunun giriş animasyonunu (kaydırmanın mümkün olduğunu belirtmek için kaydırma çubuğunun kısaca görünür olduğu) gösterir ve bu da dikkat dağıtıcı olabilir ve kullanıcının geçerli kaydırma konumu işlem sırasında kaybolur.

Ayrıca, ilk kaydırma işlemi gerçekleşene kadar üçüncü parçayı yüklemez, bu da sorunludur, çünkü her bir parça kendi servis çağrılarını yapar ve aktivite yüklendiğinde üç ateşin de aynı anda çalışmasını tercih ederim. Üçüncü servis çağrısının ertelenmesi idealden daha azdır.

ViewPager'i bu davranışı durdurmaya ve tüm parçalarımı bellekte tutmaya ikna etmenin bir yolu var mı?

Yanıtlar:


332

Gelen revizyon 4 Destek Paketi, bir yöntem oldukça 1'dir varsayılan yerine, kullanımına ekran dışında sayfa sayısını belirlemenizi sağlar ViewPager eklendi.

Sizin durumunuzda, 2'yi belirtmek istersiniz, böylece üçüncü sayfada olduğunuzda, ilk sayfa yok edilmez ve bunun tersi de geçerlidir.

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

bunu bir kapak akışında nasıl yapacağınız hakkında herhangi bir fikir?
josephus

4
Merhaba. Üzerinde çalıştığım şeyde, fragmanlar / sayfalar dinamik olarak oluşturuluyor, bu yüzden belirsiz sayıda olası fragman var. Bu durumda, genellikle 10 veya daha azına gider. Bu çözümü o kadar fazla sayfa için kullanmak hafızayı zayıflatmaz mı? Parçalar sadece bu arada görünümü tutacaktır. Teşekkürler!
mahkie

Bu yöntem atar: "java.lang.IllegalStateException: Parça zaten eklenmiş:" uygulamam için hata.
alicanbatur

Çok teşekkürler. Gerçekten işe yaradı. Ben de @chefgon gibi aynı bir sorun vardı.
Prashant

@mahie Yukarıdaki çözümler için ise Bu bir optimizasyon olarak sunulur. Sayfalarınızda desteklemeniz gereken sayfa sayısı * olduğunu veya sayfalarınızda tembel yükleme mekanizmalarını * önceden biliyorsanız, bu ayarın düzeltilmesi sayfalama animasyonlarının ve etkileşiminin algılanan düzgünlüğünde * faydalar sağlayabilir. Aynı anda etkin kalabileceğiniz az sayıda sayfanız (3-4) * varsa, yeni oluşturulan görünüm alt ağaçlarının düzeninde kullanıcı sayfaları ileri geri hareket
ederken

8

Varsayılan olarak, sayfayı kaydırdığınızda ViewPager parçaları yeniden oluşturur. Bunu önlemek için iki şeyden birini deneyebilirsiniz:

1. Parçalarınızın onCreate () öğesinde setRetainInstance (true) öğesini çağırın.

2. Parça sayısı sabitse ve nispeten küçükse, onCreate () öğenize aşağıdaki kodu ekleyin:

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

Doğru hatırlarsam, ikinci seçenek daha umut vericidir. Ama ikisini de denemenizi ve hangisinin işe yaradığını görmenizi tavsiye ediyorum.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.