Cegah ViewPager dari menghancurkan tampilan di luar layar

133

Saya memiliki ViewPager yang terhubung ke FragmentPagerAdapter yang menampilkan tiga fragmen. ViewPager muncul untuk menghancurkan tampilan fragmen yang dihosting ketika itu lebih dari satu gesek dari posisi saat ini.

Tampilan ini adalah semua daftar sederhana dan pengoptimalan ini sama sekali tidak perlu, jadi saya ingin menonaktifkannya. Ini menyebabkan beberapa masalah visual karena daftar memiliki animasi tata letak yang diterapkan padanya dan animasi tersebut sedang diputar ulang setelah dihancurkan dan diciptakan kembali. Ini juga menunjukkan animasi intro scrollbar setiap kali (di mana scrollbar terlihat secara singkat untuk menunjukkan bahwa pengguliran dimungkinkan) yang dapat mengganggu, dan posisi gulir pengguna saat ini hilang dalam proses.

Itu juga tidak memuat fragmen ketiga hingga gesekan pertama terjadi, yang bermasalah karena masing-masing fragmen menangani panggilan layanannya sendiri dan saya lebih suka mematikan ketiga pada saat yang sama ketika aktivitas dimuat. Menunda panggilan layanan ketiga kurang ideal.

Apakah ada cara untuk meyakinkan ViewPager untuk menghentikan perilaku ini dan hanya menyimpan semua fragmen saya di memori?

chefgon
sumber

Jawaban:

332

Dalam revisi 4 dari Paket Dukungan, metode telah ditambahkan ke ViewPager yang memungkinkan Anda menentukan jumlah halaman offscreen yang akan digunakan, daripada default yaitu 1.

Dalam kasus Anda, Anda ingin menentukan 2, sehingga ketika Anda berada di halaman ketiga, yang pertama tidak dihancurkan, dan sebaliknya.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);
David Snabel-Caunt
sumber
tahu bagaimana melakukan ini di coverflow?
josephus
4
Halo. Dalam apa yang saya kerjakan, fragmen / halaman akan dibuat secara dinamis sehingga ada jumlah kemungkinan fragmen yang tidak terbatas. Kasus ini, biasanya menjadi 10 atau kurang. Bukankah penggunaan memori yang buruk untuk menggunakan solusi ini untuk halaman sebanyak itu? Omong-omong, fragmen-fragmen itu hanya akan menahan pandangan. Terima kasih!
mahkie
Metode ini melempar: "java.lang.IllegalStateException: Fragment sudah menambahkan:" kesalahan untuk aplikasi saya.
alicanbatur
Terima kasih banyak. Itu benar-benar berhasil. Saya juga punya masalah yang sama seperti @chefgon.
Prashant
@mahie solusi di atas jika untuk ini ditawarkan sebagai optimasi. Jika Anda tahu sebelumnya jumlah * halaman yang Anda perlukan untuk mendukung atau memiliki mekanisme pemuatan malas * di halaman Anda, mengubah pengaturan ini dapat memiliki manfaat dalam kelancaran yang dirasakan * dari animasi halaman dan interaksi paging. Jika Anda memiliki sejumlah kecil halaman (3-4) * yang dapat Anda
aktifkan
8

Secara default, ViewPager membuat ulang fragmen ketika Anda menggesek halaman. Untuk mencegah ini, Anda dapat mencoba salah satu dari dua hal:

1. Di onCreate () dari fragmen Anda, panggil setRetainInstance (true).

2. Jika jumlah fragmen diperbaiki & relatif kecil, maka di onCreate Anda () tambahkan kode berikut:

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

Jika saya ingat dengan benar, opsi kedua lebih menjanjikan. Tapi saya mendorong Anda untuk mencoba keduanya dan melihat mana yang berfungsi.

Pankaj Talaviya
sumber