Pertanyaan Bagaimana cara menyimpan setiap posisi halaman viewpager dalam daftar mereka?


Saya memiliki daftar viewpagers dengan UnderlinePageIndicator di RecyclerView, sekitar 30 dalam satu fragmen. Saya ingin menyimpan posisi halaman dari setiap pager di objek mFlat, dan untuk mengambilnya kembali dari mFlat pada setiap pembaruan pager dengan bantuan

flatViewHolder.pager.setCurrentItem(mFlat.get(RecyclerViewPosition).getCur_pos());

Jadi ketika saya mencoba untuk menyimpan halaman saat ini dari pager pertama itu ok. Tapi setelah menggulir halaman ke bawah setiap pager tampaknya mendapatkan nomor halaman ini - yang salah. Saya ingin menyimpan setiap nomor halaman pager. Di sini adalah viewpager saya addOnPageChangeListener

flatViewHolder.pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int pos, float positionOffset, int positionOffsetPixels) {
            }
            @Override
            public void onPageSelected(int pos) {
                // save current page pos in mFlat object
                mFlat.get(position).setCur_pos(pos);
            }
            @Override
            public void onPageScrollStateChanged(int state) {
            }
        });

dan ini menyala setiap kali di viewpager berbeda ketika saya menggulir halaman

@Override
                public void onPageSelected(int pos) {
                    // save current page pos in mFlat object
                    mFlat.get(position).setCur_pos(pos);
                }

4
2017-11-18 19:08


asal


Jawaban:


Saya pikir masalahnya adalah bahwa Anda menelepon addOnPageChangeListener:

viewHolder.pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {[...]}

Karena referensi ke pager dipertahankan, setiap kali Anda menggulir Anda menambahkan pendengar baru. Ketika pendengar itu dipicu, Anda position variabel semakin digunakan di semua pendengar yang terkait dengan referensi pager.

Jadi, solusi cepat dan kotor, saya pikir, adalah untuk digunakan setOnPageChangeListener. Metode ini tidak lagi digunakan, tetapi belum dihapus dari API. Panggilan set dari pada add akan menggantikan pendengar yang saat ini terkait dengan pager dengan yang baru. Jadi hanya satu pendengar yang akan dipanggil.

Cobalah. saya berpikir itu akan membawa Anda ke mana Anda harus pergi.


3
2017-11-19 20:50



Anda perlu melakukan referensi di onPageScrolled juga, Tambahkan:

   @Override
   public void onPageScrolled(int pos, float positionOffset, int positionOffsetPixels) {

         // Update reference for page scroll too
         mFlat.get(position).setCur_pos(pos);
    }

saat Anda menggulir halaman yang tidak pernah diperbarui, hanya jika Anda memilih halaman yang akan diperbarui, seperti yang Anda miliki di atas.


2
2017-11-18 19:15