Apa perbedaan antara FragmentPagerAdapter
dan FragmentStatePagerAdapter
?
Tentang FragmentPagerAdapter
panduan Google mengatakan:
Versi pager ini terbaik untuk digunakan ketika ada beberapa fragmen statis yang lebih umum untuk di-paging, seperti seperangkat tab. Fragmen setiap halaman yang dikunjungi pengguna akan disimpan dalam memori, meskipun hierarki tampilan dapat dihancurkan saat tidak terlihat. Ini dapat mengakibatkan penggunaan jumlah memori yang signifikan karena instance fragmen dapat bertahan pada jumlah negara yang sewenang-wenang. Untuk set halaman yang lebih besar, pertimbangkan
FragmentStatePagerAdapter
.
Dan tentang FragmentStatePagerAdapter
:
Versi pager ini lebih berguna ketika ada banyak halaman, bekerja lebih seperti tampilan daftar. Ketika halaman tidak terlihat oleh pengguna, seluruh fragmennya dapat dihancurkan, hanya menjaga keadaan yang disimpan dari fragmen itu. Hal ini memungkinkan pager untuk mempertahankan memori yang jauh lebih sedikit terkait dengan setiap halaman yang dikunjungi dibandingkan dengan
FragmentPagerAdapter
biaya yang berpotensi lebih tinggi saat beralih antar halaman.
Jadi saya hanya memiliki 3 fragmen. Tetapi semuanya merupakan modul terpisah dengan sejumlah besar data.
Fragment1
menangani beberapa data (yang dimasukkan pengguna) dan meneruskannya melalui aktivitas Fragment2
, yang hanya sederhana ListFragment
. Fragment3
juga a ListFragment
.
Jadi pertanyaan saya adalah : Adaptor mana yang harus saya gunakan? FragmentPagerAdapter
atau FragmentStatePagerAdapter
?
sumber
FragmentPagerAdapter
danFragmentStatePagerAdapter
tetapi apa ituFragmentStateAdapter
?Jawaban:
Seperti kata docs, pikirkan seperti ini. Jika Anda melakukan aplikasi seperti pembaca buku, Anda tidak akan ingin memuat semua fragmen ke dalam memori sekaligus. Anda ingin memuat dan memusnahkan
Fragments
saat pengguna membaca. Dalam hal ini yang akan Anda gunakanFragmentStatePagerAdapter
. Jika Anda hanya menampilkan 3 "tab" yang tidak mengandung banyak data berat (sepertiBitmaps
),FragmentPagerAdapter
mungkin cocok untuk Anda. Perlu diingat juga bahwaViewPager
secara default akan memuat 3 fragmen ke dalam memori. Yang pertamaAdapter
Anda sebutkan mungkin menghancurkanView
hierarki dan memuatnya kembali saat diperlukan, yang keduaAdapter
hanya menyimpan keadaanFragment
dan benar-benar menghancurkannya, jika pengguna kemudian kembali ke halaman itu, keadaan diambil.sumber
FragmentPagerAdapter
untuk menggunakannya.FragmentPagerAdapter
beralih antar fragmen bisa jauh lebih cepat, karenaFragment
objek yang sebenarnya tidak perlu dibangun kembali setiap kali. Di sisi lain, ini akan berakhir dengan menggunakan lebih banyak memori yang memegang objek fragmen dalam memori.viewPager.setOffscreenPageLimit(2)
.FragmentPagerAdapter
menyimpan seluruh fragmen dalam memori, dan dapat meningkatkan overhead memori jika sejumlah besar fragmen digunakanViewPager
.Sebaliknya saudaranya,
FragmentStatePagerAdapter
hanya menyimpan keadaan Instance dari fragmen, dan menghancurkan semua fragmen ketika mereka kehilangan fokus.Karena itu
FragmentStatePagerAdapter
harus digunakan ketika kita harus menggunakan fragmen dinamis, seperti fragmen dengan widget, karena data mereka dapat disimpan dalamsavedInstanceState
. Juga tidak akan mempengaruhi kinerja bahkan jika ada sejumlah besar fragmen.Sebaliknya saudara kandungnya
FragmentPagerAdapter
harus digunakan ketika kita perlu menyimpan seluruh fragmen dalam memori.Ketika saya mengatakan seluruh fragmen disimpan dalam memori artinya, instansnya tidak akan dihancurkan dan akan membuat overhead memori. Oleh karena itu disarankan untuk digunakan
FragmentPagerAdapter
hanya ketika ada jumlah fragmen yang rendahViewPager
.Akan lebih baik jika fragmennya statis, karena mereka tidak akan memiliki sejumlah besar objek yang instansnya akan disimpan.
Untuk lebih detail,
FragmentStatePagerAdapter:
dengan
FragmentStatePagerAdapter
, fragmen yang tidak dibutuhkan Anda dihancurkan. Transaksi berkomitmen untuk sepenuhnya menghapus fragmen dari aktivitas AndaFragmentManager
.Status dalam
FragmentStatePagerAdapter
berasal dari fakta bahwa itu akan menyelamatkan fragmen AndaBundle
darisavedInstanceState
saat dihancurkan. Ketika pengguna menavigasi kembali, fragmen baru akan dipulihkan menggunakan keadaan fragmen itu.FragmentPagerAdapter:
Dengan perbandingan
FragmentPagerAdapter
tidak melakukan hal semacam itu. Ketika fragmen tidak lagi diperlukan.FragmentPagerAdapter
panggilandetach(Fragment)
pada transaksi, bukanremove(Fragment)
.Ini menghancurkan pandangan fragmen tetapi membiarkan instance fragmen hidup di
FragmentManager
. Jadi fragmen yang dibuat diFragmentPagerAdapter
tidak pernah dihancurkan.sumber
Berikut adalah siklus hidup log masing-masing fragmen
ViewPager
yang memiliki 4 fragmen danoffscreenPageLimit = 1 (default value)
FragmentStatePagerAdapter
Pergi ke Fragment1 (aktivitas peluncuran)
Pergi ke Fragment2
Pergi ke Fragment3
Pergi ke Fragment4
FragmentPagerAdapter
Pergi ke Fragment1 (aktivitas peluncuran)
Pergi ke Fragment2
Pergi ke Fragment3
Pergi ke Fragment4
Kesimpulan :
FragmentStatePagerAdapter
panggilonDestroy
saat Fragmen diatasioffscreenPageLimit
sementaraFragmentPagerAdapter
tidak.Catatan : Saya pikir kita harus menggunakan
FragmentStatePagerAdapter
untukViewPager
yang memiliki banyak halaman karena itu akan bagus untuk kinerja.Contoh dari
offscreenPageLimit
:Jika kita masuk ke Fragment3, itu akan menghancurkan Fragment1 (atau Fragment5 jika ada) karena
offscreenPageLimit = 1
. Jika kita aturoffscreenPageLimit > 1
itu tidak akan hancur.Jika dalam contoh ini, kita atur
offscreenPageLimit=4
, tidak ada perbedaan antara menggunakanFragmentStatePagerAdapter
atauFragmentPagerAdapter
karena Fragmen tidak pernah memanggilonDestroyView
danonDestroy
ketika kita mengubah tabGithub demo di sini
sumber
Sesuatu yang tidak secara eksplisit dikatakan dalam dokumentasi atau dalam jawaban di halaman ini (meskipun tersirat oleh @Naruto), adalah yang
FragmentPagerAdapter
tidak akan memperbarui Fragmen jika data dalam Fragmen berubah karena menyimpan Fragmen dalam memori.Jadi, bahkan jika Anda memiliki jumlah Fragmen terbatas untuk ditampilkan, jika Anda ingin dapat menyegarkan fragmen Anda (misalnya, Anda menjalankan kembali kueri untuk memperbarui listView dalam Fragmen), Anda perlu menggunakan FragmentStatePagerAdapter.
Seluruh poin saya di sini adalah bahwa jumlah Fragmen dan apakah mereka mirip atau tidak tidak selalu merupakan aspek kunci untuk dipertimbangkan. Apakah fragmen Anda dinamis atau tidak juga penting.
sumber
FragmentPagerAdapter
dalam aktivitas saya yang menggunakan ViewPager untuk menampilkan dua fragmen - di mana setiap fragmen berisi daftar. Daftar pertama saya disebut "Semua Laporan" dan daftar kedua adalah "Laporan Favorit". Di daftar pertama, jika saya mengetuk ikon bintang untuk laporan, itu memperbarui database untuk beralih ke status favorit dari laporan itu. Saya kemudian menggeser dan berhasil melihat laporan ini di UI daftar kedua. Jadi mungkin instance disimpan dalam memori tetapi dalam beberapa kasus (misalnya, milikku) konten akan benar-benar diperbarui dengan baik untuk FragmentPagerAdapterFragmentPagerAdapter
menyimpan data sebelumnya yang diambil dari adaptor sambilFragmentStatePagerAdapter
mengambil nilai baru dari adaptor setiap kali dieksekusi.sumber
FragmentStatePagerAdapter = Untuk mengakomodasi sejumlah besar fragmen di ViewPager. Karena adaptor ini menghancurkan fragmen ketika tidak terlihat oleh pengguna dan hanya disimpanInstanceState fragmen disimpan untuk penggunaan lebih lanjut. Dengan cara ini jumlah memori yang rendah digunakan dan kinerja yang lebih baik dikirim jika fragmen dinamis.
sumber
FragmentPagerAdapter : fragmen dari setiap halaman yang dikunjungi pengguna akan disimpan dalam memori, meskipun tampilan akan dihancurkan. Jadi ketika halaman itu terlihat lagi, tampilan akan dibuat kembali tetapi contoh fragmen tidak dibuat kembali. Ini dapat menghasilkan sejumlah besar memori yang digunakan. FragmentPagerAdapter harus digunakan ketika kita perlu menyimpan seluruh fragmen dalam memori. FragmentPagerAdapter memanggil detach (Fragment) pada transaksi alih-alih menghapus (Fragment).
FragmentStatePagerAdapter : instance fragmen dihancurkan ketika tidak terlihat oleh Pengguna, kecuali keadaan fragmen yang disimpan. Ini menghasilkan hanya menggunakan sedikit Memori dan dapat berguna untuk menangani set data yang lebih besar. Seharusnya digunakan ketika kita harus menggunakan fragmen dinamis, seperti fragmen dengan widget, karena datanya dapat disimpan di AppInstanceState yang disimpan. Juga itu tidak akan mempengaruhi kinerja bahkan jika ada sejumlah besar fragmen.
sumber