Kami mengalami masalah yang sangat aneh dengan ViewPager di sini. Kami menyematkan daftar di setiap halaman ViewPager, dan memicu notifyDataSetChanged baik pada adaptor daftar maupun adaptor tampilan halaman saat memperbarui data daftar.
Apa yang kami amati adalah terkadang, halaman tidak memperbarui struktur tampilan, yaitu tetap kosong, atau terkadang bahkan menghilang saat berpindah halaman. Saat paging bolak-balik beberapa kali, konten tiba-tiba akan muncul kembali. Sepertinya Android kehilangan pembaruan tampilan di sini. Saya juga memperhatikan bahwa saat men-debug dengan penampil hierarki, memilih tampilan akan selalu membuatnya muncul kembali, tampaknya karena penampil hierarki memaksa tampilan yang dipilih untuk menggambar ulang sendiri.
Saya tidak bisa membuat ini bekerja secara terprogram; membatalkan tampilan daftar, atau bahkan seluruh halaman tampilan, tidak berpengaruh.
Ini dengan pustaka kompatibilitas-v4_r7. Saya juga mencoba menggunakan revisi terbaru, karena ia mengklaim dapat memperbaiki banyak masalah yang berkaitan dengan view pager, tetapi itu membuat masalah menjadi lebih buruk (misalnya, isyarat rusak sehingga tidak memungkinkan saya halaman melalui semua halaman lagi kadang-kadang.)
Apakah ada orang lain yang mengalami masalah ini juga, atau apakah Anda tahu apa yang menyebabkan ini?
sumber
Jika
ViewPager
diatur di dalam Fragment denganFragmentPagerAdapter
, menggunakangetChildFragmentManager()
bukangetSupportFragmentManager()
sebagai parameter untuk menginisialisasi AndaFragmentPagerAdapter
.mAdapter = new MyFragmentPagerAdapter(getChildFragmentManager());
Dari pada
mAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
sumber
getItem()
padaFragmentPagerAdapter
yang bersarang di Fragment diciptakan.Saya memiliki masalah yang persis sama tetapi saya benar-benar menghancurkan tampilan di destroyItem (saya pikir). Masalahnya bagaimanapun adalah saya menghancurkannya menggunakan
viewPager.removeViewAt(index);
insted dariviewPager.removeView((View) object);
Salah:
@Override public void destroyItem(ViewGroup viewPager, int position, Object object) { viewPager.removeViewAt(position); }
Baik:
@Override public void destroyItem(ViewGroup viewPager, int position, Object object) { viewPager.removeView((View) object); }
sumber
ViewPager mencoba melakukan hal-hal cerdas seputar penggunaan kembali item, tetapi mengharuskan Anda untuk mengembalikan posisi item baru ketika ada hal yang berubah. Coba tambahkan ini ke PagerAdapter Anda:
public int getItemPosition (Object object) { return POSITION_NONE; }
Ini pada dasarnya memberi tahu ViewPager bahwa semuanya telah berubah (dan memaksanya untuk membuat ulang semuanya). Itulah satu-satunya hal yang dapat saya pikirkan di luar kepala saya.
sumber
return POSITION_NONE;
,forces it to re-instantiate everything
tetapi dalam kasus saya, saya tidak ingin instantiate ulang semuanya , jadi apakah mungkin untuk menghapusview
tanpa membersihkan barang yang ada? Tolong beri tahu sayaMencoba terlalu banyak solusi tetapi ternyata
viewPager.post()
berhasilmAdapter = new NewsVPAdapter(getContext(), articles); viewPager.post(new Runnable() { @Override public void run() { viewPager.setAdapter(mAdapter); } });
sumber
Pustaka Dukungan Android memiliki Aktivitas demo yang menyertakan ViewPager dengan ListView di setiap halaman. Anda mungkin harus melihat dan melihat apa fungsinya.
Di Eclipse (dengan Android Dev Tools r20):
New > Android Sample Project
Support4Demos
Android Tools > Add Support Library
Fragment
laluPager
Kode untuk ini ada di
src/com.example.android.supportv4.app/FragmentPagerSupport.java
. Semoga berhasil!sumber
Saya mengalami ini dan memiliki masalah yang sangat mirip. Saya bahkan menanyakannya pada stack overflow.
Bagi saya, sebagai orang tua dari pandangan saya, seseorang menjadi subclass
LinearLayout
dan mengesampingkanrequestLayout()
tanpa meneleponsuper.requestLayout()
. Ini dicegahonMeasure
danonLayout
dipanggil di ViewPager saya (meskipun hierarchyviewer memanggil ini secara manual). Tanpa diukur, mereka akan muncul sebagai kosong di ViewPager.Jadi periksa pandangan Anda yang berisi. Pastikan mereka subclass dari View dan tidak secara membabi buta menimpa requestLayout atau yang serupa.
sumber
Punya masalah yang sama, yang ada hubungannya dengan
ListView
(karena tampilan kosong saya muncul dengan baik jika daftar kosong). Saya baru saja menyebutrequestLayout()
yang bermasalahListView
. Sekarang menggambar dengan baik!sumber
Saya mengalami masalah yang sama ini saat menggunakan ViewPager dan FragmentStatePagerAdapter. Saya mencoba menggunakan penangan dengan penundaan 3 detik untuk memanggil invalidate () dan requestLayout () tetapi tidak berhasil. Apa yang berhasil adalah menyetel ulang warna latar belakang viewPager sebagai berikut:
MyFragment.java
private Handler mHandler; private Runnable mBugUpdater; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = new ViewPager(getActivity()); //...Create your adapter and set it here... mHandler = new Handler(); mBugUpdater = new Runnable(){ @Override public void run() { mVp.setBackgroundColor(mItem.getBackgroundColor()); mHandler = null; mBugUpdater = null; } }; mHandler.postDelayed(mBugUpdater,50); return rootView; } @Override public void onPause() { if(mHandler != null){ //Remove the callback if it hasn't triggered yet mHandler.removeCallbacks(mBugUpdater); mHandler = null; mBugUpdater = null; } super.onPause(); }
sumber
Saya memiliki masalah dengan gejala yang sama, tetapi penyebab berbeda yang ternyata adalah kesalahan konyol saya. Kupikir aku akan menambahkannya di sini kalau-kalau itu membantu siapa pun.
Saya memiliki ViewPager menggunakan FragmentStatePagerAdapter yang dulu memiliki dua fragmen, tetapi saya kemudian menambahkan yang ketiga. Namun, saya lupa bahwa batas halaman layar mati default adalah 1 - jadi, ketika saya beralih ke fragmen ketiga yang baru, yang pertama akan dihancurkan, kemudian dibuat ulang setelah beralih kembali. Masalahnya adalah bahwa aktivitas saya bertugas memberi tahu fragmen ini untuk menginisialisasi status UI-nya. Ini terjadi saat aktivitas dan siklus hidup fragmen sama, tetapi untuk memperbaikinya saya harus mengubah fragmen untuk menginisialisasi UI mereka sendiri selama siklus hidup startup mereka. Pada akhirnya saya juga akhirnya mengubah setOffscreenPageLimit menjadi 2 sehingga ketiga fragmen tetap hidup setiap saat (aman dalam hal ini karena tidak terlalu intensif memori).
sumber
Saya memiliki masalah serupa. Saya menyimpan cache tampilan karena saya hanya perlu 3 tampilan
ViewPager
. Ketika saya geser ke depan semuanya baik-baik saja tetapi ketika saya mulai meluncur ke belakang terjadi kesalahan, dikatakan bahwa "pandangan saya sudah memiliki induk". Solusinya adalah menghapus item yang tidak dibutuhkan secara manual.@Override public Object instantiateItem(ViewGroup container, int position) { int localPos = position % SIZE; TouchImageView view; if (touchImageViews[localPos] != null) { view = touchImageViews[localPos]; } else { view = new TouchImageView(container.getContext()); view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); touchImageViews[localPos] = view; } view.setImageDrawable(mDataModel.getPhoto(position)); Log.i(IRViewPagerAdpt.class.toString(), "Add view " + view.toString() + " at pos: " + position + " " + localPos); if (view.getParent() == null) { ((ViewPager) container).addView(view); } return view; } @Override public void destroyItem(ViewGroup container, int position, Object view) { // ((ViewPager) container).removeView((View) view); Log.i(IRViewPagerAdpt.class.toString(), "remove view " + view.toString() + " at pos: " + position); } .................. private static final int SIZE = 3; private TouchImageView[] touchImageViews = new TouchImageView[SIZE];
sumber
Bagi saya masalahnya adalah kembali ke aktivitas setelah proses aplikasi dihentikan. Saya menggunakan adaptor halaman tampilan kustom yang dimodifikasi dari sumber Android. Halaman tampilan disematkan langsung di aktivitas.
Panggilan
viewPager.setCurrentItem(position, true);
(dengan animasi) setelah menyetel data dan notifyDataSetChanged () tampaknya berfungsi, tetapi jika parameter disetel ke false, ia tidak dan fragmennya kosong. Ini adalah kasus tepi yang mungkin bisa membantu seseorang.
sumber
Untuk pengguna Kotlin:
Dalam fragmen Anda; Gunakan
childFragmentManager
sebagai gantiviewPagerAdapter
sumber