Saya tidak dapat menggunakan kembali fragmen di FragmentPagerAdapter .. Menggunakan metode destroyItem (), Ini menghapus fragmen tetapi masih tidak memanggil getItem () lagi..Hanya ada 2-3 Gambar jadi saya menggunakan FragmentPagerAdapter, bukan FragmentStatePagerAdapter ..
public class ExamplePagerAdapter extends FragmentPagerAdapter {
ArrayList < String > urls;
int size = 0;
public ExamplePagerAdapter(FragmentManager fm, ArrayList < String > res) {
super(fm);
urls = res;
size = urls.size();
}
@Override
public int getCount() {
if (urls == null) {
return 0;
} else {
return size;
}
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
FragmentManager manager = ((Fragment) object).getFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove((Fragment) object);
trans.commit();
}
@Override
public Fragment getItem(int position) {
Fragment fragment = new FloorPlanFragment();
Bundle b = new Bundle();
b.putInt("p", position);
b.putString("image", urls.get(position));
Log.i("image", "" + urls.get(position));
fragment.setArguments(b);
return fragment;
}
}
Dan Di FragmentActivity,
pager.setAdapter(new ExamplePagerAdapter(getSupportFragmentManager(), res2));
destroyItem()
? Itu tidak perlu.Jawaban:
KISS Jawaban:
Gunakan FragmentStatePagerAdapter secara sederhana, bukan FragmentPagerAdapter .
Saya mendapat jawabannya .. Pertama saya berpikir untuk menghapus pertanyaan ini karena saya melakukan kesalahan yang sangat konyol tetapi jawaban ini akan membantu seseorang yang menghadapi masalah yang sama daripada
FragmentPagerAdapter
menggunakanFragmentStatePagerAdapter
.Seperti yang disebutkan @BlackHatSamurai di komentar:
sumber
Menggunakan sebuah
FragmentStatePagerAdapter
tidak sepenuhnya memperbaiki masalah saya yang merupakan masalah serupa di manaonCreateView
tidak dipanggil untuk fragmen anak di halaman tampilan. Saya benar-benar menumpukFragmentPagerAdapter
di dalam saya yang lainFragment
karenaFragmentManager
itu dibagikan di semua dari mereka dan dengan demikian mempertahankan contoh dari fragmen lama. Perbaikannya adalah dengan memberi makan sebuah instance darigetChildFragmentManager
ke konstruktor diFragmentPagerAdapter
dalam fragmen host saya. Sesuatu seperti...The
getChildFragmentManager()
Metode dapat diakses melalui fragmen dan ini bekerja untuk saya karena mengembalikan swastaFragmentManager
untuk fragmen yang khusus untuk situasi di mana fragmen bersarang diperlukan. Saya harap ini membantu seseorang yang mungkin mengalami masalah yang sama dengan saya !!getChildFragmentManager()
versi API minimum Anda harus minimal17 (4.2)
, jadi ini dapat membuang kunci pas di gigi Anda. Tentu saja, jika Anda menggunakan fragmen dari support library v4 Anda akan baik-baik saja.sumber
Mengesampingkan
long getItemId (int position)
FragmentPagerAdapter
menyimpan cache fragmen yang dibuatnya menggunakangetItem
. Saya menghadapi masalah yang sama - bahkan setelah meneleponnotifyDataSetChanged()
getItem
tidak dipanggil.Ini sebenarnya adalah fitur dan bukan bug. Anda perlu mengganti
getItemId
agar Anda dapat menggunakan kembali fragmen Anda dengan benar. Karena Anda menghapus fragmen, posisi Anda berubah. Seperti yang disebutkan dalam dokumen:Cukup berikan id unik untuk setiap fragmen dan Anda selesai.
Menggunakan
FragementStatePagerAdapter
atau kembaliPOSITION_NONE
diint getItemPosition (Object object)
salah. Anda tidak akan mendapatkan cache apa pun.sumber
getItemId
DAN menyesuaikangetItemPosition
untuk mengembalikanPOSITION_NONE
JIKA fragmen harus dihapus. Saya memiliki bendera enum untuk itu. Setelah itugetItem
akan dipanggil.Saya melakukan apa yang telah diposting @kanika dan @ Jraco11 tetapi saya masih mengalami masalah.
Jadi, setelah banyak perubahan, saya menemukan satu yang berfungsi untuk saya dan ditambahkan ke FragmentPagerAdapter saya kode berikutnya:
Menurut apa yang saya baca, getItemPosition digunakan untuk memberi tahu ViewPager apakah akan menyegarkan item atau tidak, dan untuk menghindari pembaruan jika item pada posisi yang terlihat tidak berubah.
sumber
Ada dua skenario berbeda: 1.) Anda memiliki tata letak yang sama untuk setiap pager: Dalam hal ini, akan lebih baik jika Anda memperluas adaptor khusus Anda dengan PagerAdapter dan mengembalikan satu tata letak.
2.) Anda memiliki tata letak yang berbeda untuk setiap halaman: Dalam hal ini, akan lebih baik jika Anda memperluas adaptor kustom Anda dengan FragmentStatePagerAdapter dan mengembalikan fragmet yang berbeda untuk setiap halaman.
sumber
metode
getItem()
digunakan hanya untuk membuat item baru. Setelah dibuat, metode ini tidak akan dipanggil. Jika Anda perlu mendapatkan item mata uang yang digunakan oleh adaptor, gunakan metode ini:sumber
Saya menemukan bahwa menyetel listener pada tab-layout menghentikan pemanggilan ini, mungkin karena mereka hanya memiliki ruang untuk satu listener di
tabLayout.setOnTabSelectedListener
alih-alih array listener.sumber