Saya menggunakan ViewPager dari perpustakaan kompatibilitas. Saya telah berhasil menampilkan beberapa tampilan yang bisa saya lihat.
Namun, saya mengalami kesulitan mencari tahu cara memperbarui ViewPager dengan serangkaian Tampilan baru.
Saya sudah mencoba segala macam hal seperti menelepon mAdapter.notifyDataSetChanged()
, mViewPager.invalidate()
bahkan membuat adaptor baru setiap kali saya ingin menggunakan Daftar data baru.
Tidak ada yang membantu, tampilan teks tetap tidak berubah dari data asli.
Pembaruan: Saya membuat proyek uji kecil dan saya hampir dapat memperbarui pandangan. Saya akan menempelkan kelas di bawah ini.
Apa yang tampaknya tidak memperbarui adalah tampilan ke-2, 'B' tetap, itu akan menampilkan 'Y' setelah menekan tombol pembaruan.
public class ViewPagerBugActivity extends Activity {
private ViewPager myViewPager;
private List<String> data;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
data = new ArrayList<String>();
data.add("A");
data.add("B");
data.add("C");
myViewPager = (ViewPager) findViewById(R.id.my_view_pager);
myViewPager.setAdapter(new MyViewPagerAdapter(this, data));
Button updateButton = (Button) findViewById(R.id.update_button);
updateButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
updateViewPager();
}
});
}
private void updateViewPager() {
data.clear();
data.add("X");
data.add("Y");
data.add("Z");
myViewPager.getAdapter().notifyDataSetChanged();
}
private class MyViewPagerAdapter extends PagerAdapter {
private List<String> data;
private Context ctx;
public MyViewPagerAdapter(Context ctx, List<String> data) {
this.ctx = ctx;
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object instantiateItem(View collection, int position) {
TextView view = new TextView(ctx);
view.setText(data.get(position));
((ViewPager)collection).addView(view);
return view;
}
@Override
public void destroyItem(View collection, int position, Object view) {
((ViewPager) collection).removeView((View) view);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public void startUpdate(View arg0) {
}
@Override
public void finishUpdate(View arg0) {
}
}
}
sumber
Jawaban:
Ada beberapa cara untuk mencapai ini.
Opsi pertama lebih mudah, tetapi sedikit lebih tidak efisien.
Ganti
getItemPosition
dengan AndaPagerAdapter
seperti ini:Dengan cara ini, saat Anda menelepon
notifyDataSetChanged()
, pager tampilan akan menghapus semua tampilan dan memuat semuanya. Dengan demikian efek reload diperoleh.Opsi kedua, yang disarankan oleh Alvaro Luis Bustamante (sebelumnya alvarolb) , adalah
setTag()
metodeinstantiateItem()
ketika membuat tampilan baru. Kemudian, alih-alih menggunakannotifyDataSetChanged()
, Anda dapat menggunakanfindViewWithTag()
untuk menemukan tampilan yang ingin Anda perbarui.Pendekatan kedua sangat fleksibel dan berkinerja tinggi. Kudos to alvarolb untuk penelitian asli.
sumber
Saya tidak berpikir ada bug apa pun di Internet
PagerAdapter
. Masalahnya adalah bahwa memahami cara kerjanya sedikit rumit. Melihat solusi yang dijelaskan di sini, ada kesalahpahaman dan oleh karena itu penggunaan pandangan instantiated yang buruk dari sudut pandang saya.Beberapa hari terakhir saya bekerja dengan
PagerAdapter
danViewPager
, dan saya menemukan yang berikut:The
notifyDataSetChanged()
metode padaPagerAdapter
hanya akan memberitahukanViewPager
bahwa halaman yang mendasari telah berubah. Sebagai contoh, jika Anda telah membuat / menghapus halaman secara dinamis (menambah atau menghapus item dari daftar Anda), ituViewPager
harus diurus. Dalam hal ini saya berpikir bahwaViewPager
menentukan apakah tampilan baru harus dihapus atau dipakai menggunakan metodegetItemPosition()
dangetCount()
.Saya pikir
ViewPager
, setelahnotifyDataSetChanged()
panggilan telepon itu dilihat anak dan diperiksa posisi mereka dengangetItemPosition()
. Jika untuk tampilan anak-anak metode ini kembaliPOSITION_NONE
,ViewPager
memahami bahwa tampilan telah dihapus, memanggildestroyItem()
, dan menghapus tampilan ini.Dengan cara ini, mengesampingkan
getItemPosition()
untuk selalu kembaliPOSITION_NONE
benar-benar salah jika Anda hanya ingin memperbarui konten halaman, karena tampilan yang dibuat sebelumnya akan dihancurkan dan yang baru akan dibuat setiap kali Anda meneleponnotifyDatasetChanged()
. Tampaknya tidak begitu salah hanya untuk beberapaTextView
s, tetapi ketika Anda memiliki pandangan yang kompleks, seperti ListViews yang dihuni dari database, ini bisa menjadi masalah nyata dan pemborosan sumber daya.Jadi ada beberapa pendekatan untuk mengubah konten tampilan secara efisien tanpa harus menghapus dan membuat instance tampilan lagi. Itu tergantung pada masalah yang ingin Anda pecahkan. Pendekatan saya adalah menggunakan
setTag()
metode untuk tampilan instantiated dalaminstantiateItem()
metode ini. Jadi ketika Anda ingin mengubah data atau membatalkan tampilan yang Anda butuhkan, Anda dapat memanggilfindViewWithTag()
metode diViewPager
untuk mengambil tampilan yang sebelumnya dipakai dan memodifikasi / menggunakannya seperti yang Anda inginkan tanpa harus menghapus / membuat tampilan baru setiap kali Anda inginkan untuk memperbarui beberapa nilai.Bayangkan misalnya Anda memiliki 100 halaman dengan 100
TextView
s dan Anda hanya ingin memperbarui satu nilai secara berkala. Dengan pendekatan yang dijelaskan sebelumnya, ini berarti Anda menghapus dan membuat Instansi 100TextView
pada setiap pembaruan. Ini tidak masuk akal...sumber
setTag
metodeonInstantiateItem
, Apakah Anda ingin memperbarui jawaban ini dengan beberapa pengkodean? Terima kasih.Ubah
FragmentPagerAdapter
keFragmentStatePagerAdapter
.Ganti
getItemPosition()
metode dan kembaliPOSITION_NONE
.Akhirnya, ia akan mendengarkan
notifyDataSetChanged()
pager tampilan.sumber
Jawaban yang diberikan oleh alvarolb jelas merupakan cara terbaik untuk melakukannya. Membangun atas jawabannya, cara mudah untuk menerapkan ini adalah dengan hanya menyimpan pandangan aktif berdasarkan posisi:
Kemudian sekali dengan mengganti
notifyDataSetChanged
metode Anda dapat menyegarkan tampilan ...Anda benar-benar dapat menggunakan kode serupa di
instantiateItem
dannotifyDataSetChanged
untuk menyegarkan tampilan Anda. Dalam kode saya, saya menggunakan metode yang sama persis.sumber
Punya masalah yang sama. Bagi saya ini berhasil memperluas FragmentStatePagerAdapter, dan mengganti metode di bawah ini:
sumber
Setelah berjam-jam frustrasi ketika mencoba semua solusi di atas untuk mengatasi masalah ini dan juga mencoba banyak solusi pada pertanyaan serupa lainnya seperti ini , ini dan ini yang semuanya GAGAL dengan saya untuk menyelesaikan masalah ini dan membuat
ViewPager
untuk menghancurkan yang lamaFragment
dan mengisipager
dengan yang baruFragment
. Saya telah memecahkan masalah sebagai berikut:1) Buat
ViewPager
kelas untuk diperluasFragmentPagerAdapter
sebagai berikut:2) Buat Item untuk
ViewPager
toko itutitle
danfragment
sebagai berikut:3) Buat konstruktor
ViewPager
takeFragmentManager
instance saya untuk menyimpannya di sayaclass
sebagai berikut:4) Buat metode untuk mengatur ulang
adapter
data dengan data baru dengan menghapus semua sebelumnyafragment
darifragmentManager
itu sendiri secara langsung untuk membuatadapter
untuk mengatur yang barufragment
dari daftar baru lagi sebagai berikut:5) Dari wadah
Activity
atauFragment
jangan inisialisasi ulang adaptor dengan data baru. Atur data baru melalui metodesetPagerItems
dengan data baru sebagai berikut:Saya harap ini membantu.
sumber
Saya memiliki masalah yang sama dan solusi saya gunakan
FragmentPagerAdapter
dengan mengesampingkanFragmentPagerAdapter#getItemId(int position)
:Secara default, metode ini mengembalikan posisi item. Saya kira itu
ViewPager
memeriksa apakahitemId
telah diubah dan membuat ulang halaman hanya jika itu. Tetapi versiitemId
yang tidak diganti mengembalikan posisi yang sama bahkan jika halaman sebenarnya berbeda, dan ViewPager tidak mendefinisikan halaman yang diganti dan harus dibuat ulang.Untuk menggunakan ini,
long id
diperlukan untuk setiap halaman. Biasanya ini diharapkan unik, tetapi saya sarankan, untuk kasus ini, hanya berbeda dari nilai sebelumnya untuk halaman yang sama. Jadi, dimungkinkan untuk menggunakan penghitung kontinu dalam adaptor atau bilangan bulat acak (dengan distribusi luas) di sini.Saya pikir ini lebih konsisten daripada menggunakan Tag of view yang disebutkan sebagai solusi dalam topik ini. Tapi mungkin tidak untuk semua kasus.
sumber
PagerAdapter
. Kelas apa ini?FragmentPagerAdapter
Saya menemukan keputusan yang sangat menarik dari masalah ini. Alih-alih menggunakan FragmentPagerAdapter , yang menyimpan semua fragmen dalam memori, kita dapat menggunakan FragmentStatePagerAdapter ( android.support.v4.app.FragmentStatePagerAdapter ), yang memuat ulang fragmen setiap kali, ketika kita memilihnya.
Realisasi kedua adapter itu identik. Jadi, kita hanya perlu mengubah " extended FragmentPagerAdapter " pada " extended FragmentStatePagerAdapter "
sumber
Setelah banyak mencari masalah ini, saya menemukan solusi yang sangat baik yang saya pikir adalah cara yang tepat untuk menyelesaikan masalah ini. Pada dasarnya, instantiateItem hanya dipanggil ketika tampilan instantiated dan tidak pernah lagi kecuali tampilan dihancurkan (ini adalah apa yang terjadi ketika Anda mengganti fungsi getItemPosition untuk mengembalikan POSITION_NONE). Sebaliknya, apa yang ingin Anda lakukan adalah menyimpan tampilan yang dibuat dan memperbaruinya di adaptor, menghasilkan fungsi get sehingga orang lain dapat memperbaruinya, atau fungsi set yang memperbarui adaptor (favorit saya).
Jadi, di MyViewPagerAdapter Anda tambahkan variabel seperti:
sebuah di instantiateItem Anda:
jadi, dengan cara ini, Anda dapat membuat fungsi yang akan memperbarui tampilan Anda:
Semoga ini membantu!
sumber
instantiateItem
sehingga pandangan saya tidak diperbarui. Dari jawaban Anda, saya menyadarinya. +1Dua setengah tahun setelah OP mengajukan pertanyaannya, masalah ini masih, yah, masih menjadi masalah. Jelas prioritas Google dalam hal ini tidak terlalu tinggi, jadi daripada mencari perbaikan, saya menemukan solusi. Terobosan besar bagi saya adalah mencari tahu apa penyebab sebenarnya dari masalah itu (lihat jawaban yang diterima di pos ini ). Setelah jelas bahwa masalahnya adalah bahwa setiap halaman aktif tidak di-refresh dengan benar, solusi saya jelas:
Dalam Fragmen saya (halaman):
Di Aktivitas saya, tempat saya memuat halaman:
Setelah ini, ketika Anda memuat ulang set halaman kedua, bug masih akan menyebabkan beberapa orang menampilkan data lama. Namun, mereka sekarang akan di-refresh dan Anda akan melihat data baru - pengguna Anda tidak akan tahu halaman itu salah karena penyegaran ini akan terjadi sebelum mereka melihat halaman.
Semoga ini bisa membantu seseorang!
sumber
Semua solusi ini tidak membantu saya. jadi saya menemukan solusi yang berfungsi: Anda dapat
setAdapter
setiap waktu, tetapi itu tidak cukup. Anda harus melakukan ini sebelum mengganti adaptor:dan setelah ini:
sumber
ViewPager
bagian dalam, jadi digantislideShowPagerAdapter.getFragmentManager()
dengangetChildFragmentManager()
. MungkingetFragmentManager()
akan membantu dalam kasus Anda. Saya menggunakanFragmentPagerAdapter
, bukanFragmentStatePagerAdapter
. Lihat juga stackoverflow.com/a/25994654/2914140 untuk cara meretas.Cara yang jauh lebih mudah: gunakan a
FragmentPagerAdapter
, dan bungkus tampilan halaman Anda ke dalam fragmen. Mereka diperbaruisumber
Terima kasih rui.araujo dan Alvaro Luis Bustamante. Pada awalnya, saya mencoba menggunakan cara rui.araujo, karena itu mudah. Ini berfungsi tetapi ketika data berubah, halaman akan menggambar ulang dengan jelas. Itu buruk jadi saya mencoba menggunakan cara Alvaro Luis Bustamante. Itu sempurna. Ini kodenya:
Dan ketika data berubah:
sumber
Kalau-kalau ada orang yang menggunakan adaptor berbasis FragmentStatePagerAdapter (yang akan membuat ViewPager membuat halaman minimum yang diperlukan untuk tujuan tampilan, paling banyak 2 untuk kasus saya), jawaban @ rui.araujo tentang menimpa getItemPosition di adaptor Anda tidak akan menyebabkan pemborosan yang signifikan, tetapi tetap saja dapat ditingkatkan.
Dalam kode semu:
sumber
getItemPosition()
ketika dataset berubah, dan ViewPager akan tahu mereka berubah atau tidak. Sayangnya, ViewPager tidak melakukannya.Saya memiliki masalah yang sama di mana saya memiliki empat halaman dan satu halaman memperbarui tampilan pada tiga lainnya. Saya dapat memperbarui widget (SeekBars, TextViews, dll.) Di halaman yang berdekatan dengan halaman saat ini. Dua halaman terakhir akan memiliki widget yang tidak diinisialisasi saat menelepon
mTabsAdapter.getItem(position)
.Untuk mengatasi masalah saya, saya menggunakan
setSelectedPage(index)
sebelum menelepongetItem(position)
. Ini akan membuat Instantiate halaman, memungkinkan saya untuk dapat mengubah nilai dan widget pada setiap halaman.Setelah semua pembaruan saya akan gunakan
setSelectedPage(position)
diikuti olehnotifyDataSetChanged()
.Anda dapat melihat sedikit kedipan di ListView pada halaman pembaruan utama, tetapi tidak ada yang terlihat. Saya belum mengujinya secara menyeluruh, tetapi itu memecahkan masalah langsung saya.
sumber
Saya hanya memposting jawaban ini jika ada orang lain yang merasa berguna. Untuk melakukan hal yang persis sama, saya cukup mengambil kode sumber dari ViewPager dan PagerAdapter dari perpustakaan kompatibilitas dan mengkompilasinya dalam kode saya (Anda perlu memilah semua kesalahan dan mengimpor sendiri, tetapi pasti bisa dilakukan).
Kemudian, di CustomViewPager, buat metode yang disebut updateViewAt (posisi int). Tampilan itu sendiri dapat diperoleh dari mrayems ArrayList didefinisikan dalam kelas ViewPager (Anda perlu mengatur Id untuk tampilan di item instantiate dan membandingkan id ini dengan posisi dalam metode updateViewAt ()). Kemudian Anda dapat memperbarui tampilan sesuai kebutuhan.
sumber
Saya kira, saya punya logika ViewPager.
Jika saya perlu menyegarkan satu set halaman dan menampilkannya berdasarkan dataset baru, saya panggil notifyDataSetChanged () . Kemudian, ViewPager membuat sejumlah panggilan ke getItemPosition () , dengan meneruskan Fragment sebagai Object. Fragmen ini dapat berasal dari dataset lama (yang ingin saya buang) atau dari yang baru (yang ingin saya tampilkan). Jadi, saya mengganti getItemPosition () dan saya harus menentukan apakah Fragment saya berasal dari dataset lama atau dari yang baru.
Dalam kasus saya, saya memiliki tata letak 2-pane dengan daftar item teratas di panel kiri dan tampilan geser (ViewPager) di sebelah kanan. Jadi, saya menyimpan tautan ke item teratas saya saat ini di dalam PagerAdapter saya dan juga di dalam setiap Fragment halaman instantiated. Ketika item teratas yang dipilih dalam daftar berubah, saya menyimpan item teratas baru di PagerAdapter dan memanggil notifyDataSetChanged () . Dan di getItemPosition yang ditimpa () saya membandingkan item teratas dari adaptor saya ke item teratas dari fragmen saya. Dan hanya jika mereka tidak sama, saya mengembalikan POSITION_NONE. Kemudian, PagerAdapter mengembalikan semua fragmen yang telah mengembalikan POSITION_NONE.
CATATAN. Menyimpan id item teratas daripada referensi mungkin merupakan ide yang lebih baik.
Cuplikan kode di bawah ini agak skematis tapi saya mengadaptasinya dari kode yang sebenarnya berfungsi.
Terima kasih untuk semua peneliti sebelumnya!
sumber
Kode di bawah ini berfungsi untuk saya.
Buat kelas yang memperluas kelas FragmentPagerAdapter seperti di bawah ini.
Lalu di dalam setiap Fragmen yang Anda buat, buat metode updateFragment. Dalam metode ini Anda mengubah hal-hal yang perlu Anda ubah dalam fragmen. Sebagai contoh dalam kasus saya, Fragment0 berisi GLSurfaceView yang menampilkan objek 3d berdasarkan path ke file .ply, jadi di dalam metode updateFragment saya, saya mengubah path ke file ply ini.
lalu buat instance ViewPager,
dan contoh Adpater,
maka lakukan ini,
Kemudian di dalam kelas Anda menginisialisasi kelas Adapter di atas dan membuat viewPager, setiap kali Anda ingin memperbarui salah satu fragmen Anda (dalam kasus kami Fragment0) gunakan yang berikut ini:
Solusi ini didasarkan pada teknik yang disarankan oleh Alvaro Luis Bustamante.
sumber
1.Pertama Anda harus menetapkan metode getItemposition di kelas Pageradapter Anda 2. Anda harus membaca posisi Persis dari Tampilan Pager Anda 3. lalu kirim posisi itu sebagai lokasi data yang baru. 4.Tuliskan tombol pembaruan pada pendengar klik di dalam setonPageChange pendengar
kode program itu sedikit saya modifikasi untuk mengatur elemen posisi tertentu saja
sumber
apa yang berhasil bagi saya akan terjadi
viewPager.getAdapter().notifyDataSetChanged();
dan di adaptor meletakkan kode Anda untuk memperbarui tampilan di dalam
getItemPosition
seperti itumungkin bukan cara yang paling benar untuk menyelesaikannya tetapi berhasil (
return POSITION_NONE
triknya menyebabkan crash bagi saya jadi bukankah pilihan)sumber
Anda dapat memperbarui semua fragmen secara dinamis, Anda dapat melihat dalam tiga langkah.
Di adaptor Anda:
Sekarang dalam aktivitas Anda:
Akhirnya dalam fragmen Anda, sesuatu seperti itu:
Anda dapat melihat kode lengkap di sini .
Terima kasih Alvaro Luis Bustamante.
sumber
Selalu kembali
POSITION_NONE
adalah hal yang sederhana tetapi sedikit tidak efisien karena itu membangkitkan instantiasi dari semua halaman yang sudah instantiated.Saya telah membuat perpustakaan ArrayPagerAdapter untuk mengubah item di PagerAdapters secara dinamis.
Secara internal, adaptor perpustakaan ini kembali
POSITION_NONE
aktifgetItemPosiition()
hanya bila diperlukan.Anda dapat mengubah item secara dinamis seperti mengikuti dengan menggunakan perpustakaan ini.
Perpustakaan Thils juga mendukung halaman yang dibuat oleh Fragmen.
sumber
Ini untuk semua orang seperti saya, yang perlu memperbarui Viewpager dari layanan (atau utas latar belakang lainnya) dan tidak ada proposal yang berhasil: Setelah sedikit pemeriksaan log saya sadari, bahwa metode notifyDataSetChanged () tidak pernah kembali. getItemPosition (Object object) disebut semua ujung di sana tanpa proses lebih lanjut. Kemudian saya temukan di dokumen kelas PagerAdapter induk (tidak dalam dokumen subclass), "Perubahan set data harus terjadi pada utas utama dan harus diakhiri dengan panggilan untuk notifyDataSetChanged ()". Jadi, solusi yang berfungsi dalam hal ini adalah (menggunakan FragmentStatePagerAdapter dan getItemPosition (objek objek) diatur untuk mengembalikan POSITION_NONE):
dan kemudian panggilan untuk notifyDataSetChanged ():
sumber
Anda dapat menambahkan transformasi pager pada Viewpager seperti ini
Dalam kode di bawah ini saya mengubah warna tampilan saya saat runtime ketika pager gulir
sumber
Aku tahu aku terlambat, tapi tetap saja itu bisa membantu seseorang. Saya hanya memperluas jawaban yang diterima dan saya juga menambahkan komentar di atasnya.
baik,
jawabannya sendiri mengatakan itu tidak efisien
jadi untuk membuatnya refresh hanya ketika diperlukan, kamu bisa melakukan ini
sumber
ViewPager tidak dirancang untuk mendukung perubahan tampilan dinamis.
Saya mendapat konfirmasi tentang ini saat mencari bug lain yang terkait dengan ini https://issuetracker.google.com/issues/36956111 dan khususnya https://issuetracker.google.com/issues/36956111#comment56
Pertanyaan ini agak lama, tetapi Google baru-baru ini menyelesaikan masalah ini dengan ViewPager2 . Ini akan memungkinkan untuk mengganti solusi buatan tangan (tidak terawat dan berpotensi buggy) dengan yang standar. Itu juga mencegah menciptakan kembali pandangan yang tidak perlu seperti yang dilakukan beberapa jawaban.
Untuk contoh ViewPager2, Anda dapat memeriksa https://github.com/googlesamples/android-viewpager2
Jika Anda ingin menggunakan ViewPager2, Anda harus menambahkan dependensi berikut dalam file build.gradle Anda:
Kemudian Anda dapat mengganti ViewPager Anda di file xml Anda dengan:
Setelah itu, Anda perlu mengganti ViewPager dengan ViewPager2 dalam aktivitas Anda
ViewPager2 membutuhkan RecyclerView.Adapter, atau FragmentStateAdapter, dalam kasus Anda itu bisa menjadi RecyclerView.Adapter
Jika Anda menggunakan TabLayout, Anda bisa menggunakan TabLayoutMediator:
Kemudian Anda akan dapat menyegarkan tampilan Anda dengan memodifikasi data adaptor Anda dan memanggil metode notifyDataSetChanged
sumber
Daripada mengembalikan
POSITION_NONE
dan membuat semua fragmen lagi, Anda dapat melakukan seperti yang saya sarankan di sini: Perbarui ViewPager secara dinamis?sumber
Saya pikir saya telah membuat cara sederhana untuk memberi tahu perubahan set data:
Pertama, ubah sedikit cara fungsi instantiateItem bekerja:
untuk "updateView", isi tampilan dengan semua data yang ingin Anda isi (setText, setBitmapImage, ...).
verifikasi bahwa destroyView berfungsi seperti ini:
Sekarang, anggaplah Anda perlu mengubah data, melakukannya, dan kemudian memanggil fungsi berikutnya pada PagerAdapter:
Misalnya, jika Anda ingin memberi tahu semua tampilan yang ditampilkan oleh viewPager bahwa ada sesuatu yang berubah, Anda dapat menghubungi:
Itu dia.
sumber
Untuk apa nilainya, pada KitKat + tampaknya
adapter.notifyDataSetChanged()
sudah cukup untuk menyebabkan tampilan baru muncul, asalkan Anda sudahsetOffscreenPageLimit
cukup tinggi. Saya bisa mendapatkan perilaku yang diinginkan dengan melakukanviewPager.setOffscreenPageLimit(2)
.sumber
Saya benar-benar menggunakan
notifyDataSetChanged()
padaViewPager
danCirclePageIndicator
dan setelah itu saya sebutdestroyDrawingCache()
diViewPager
dan bekerja .. Tak satu pun dari solusi lain bekerja untuk saya.sumber