Bagaimana cara mengubah halaman ViewPager?

150

Saya menggunakan ViewPager di aplikasi saya dan mendefinisikannya di Aktivitas utama. Di dalam onCreatemetode saya memuat beberapa halaman dari SharedPreferences dan kemudian meneruskannya ke PagerAdapter:

@Override
public int getCount() {
    return numberOfPages;
}

Masalahnya adalah jika saya mengubah nomor ini di Preferensi (atau Aktivitas lain) ke indeks halaman lain yang kurang dari yang saya lihat sebelumnya, aplikasi saya mogok karena indeks ini di luar batas ketika saya kembali ke aktivitas dengan ViewPager ini. Itu dapat diperbaiki hanya dengan mengubah halaman ViewPager yang aktif. Apakah ada cara untuk melakukannya?

Roma
sumber

Jawaban:

394

Saya tidak yakin bahwa saya sepenuhnya memahami pertanyaan itu, tetapi dari judul pertanyaan Anda, saya menduga bahwa yang Anda cari adalah pager.setCurrentItem( num ). Itu memungkinkan Anda untuk secara terprogram beralih ke halaman lain dalam ViewPager.

Saya perlu melihat jejak stack dari logcat untuk lebih spesifik jika ini bukan masalahnya.

Mark Allison
sumber
3
Ya, itulah yang saya butuhkan. Saya mengaturnya 0dalam onPausemetode dan tidak ada crash. Terima kasih.
Roman
1
Memang ada dokumentasi yang sangat sedikit di ViewPager. +1 untuk itu.
Arnab Chakraborty
1
jika pager Anda mengambil banyak waktu untuk memuat halaman daripada yang dapat Anda gunakan setOffscreenPageLimit (1), karena secara default tampilan pager memuat halaman +1 dan -1 dari posisi saat ini
Ajay Pandya
Ini tidak berfungsi, saya hanya mendapatkan kesalahan dengan mengatakan bahwa fragmen telah ditambahkan.
BlondeSwan
24

geser ke kanan

viewPager.arrowScroll (View.FOCUS_RIGHT);

geser ke kiri

viewPager.arrowScroll (View.FOCUS_LEFT);

Abror Esonaliyev
sumber
pendek dan bersih!
dakshbhatt21
1
Saya hampir percaya bahwa ini harus menjadi jawaban yang diterima. Ini jauh lebih praktis daripada mengatur item saat ini.
Peter
18

Tanpa memeriksa kode Anda, saya pikir apa yang Anda uraikan adalah bahwa halaman Anda tidak sinkron dan Anda memiliki data basi.

Anda mengatakan Anda mengubah jumlah halaman, lalu mogok karena Anda mengakses set halaman yang lama. Bagi saya ini kedengarannya seperti Anda tidak meneleponpageAdapter.notifyDataSetChanged() setelah mengubah data Anda.

Ketika Anda viewPagermenampilkan halaman 3 dari set 10 halaman, dan Anda mengubah ke set dengan hanya 5, kemudian menelepon notifyDataSetChanged(), apa yang akan Anda temukan adalah Anda sekarang melihat halaman 3 dari set baru. Jika sebelumnya Anda melihat halaman 8 dari set lama, setelah memasukkan set baru dan menelepon notifyDataSetChanged()Anda akan menemukan Anda sekarang melihat halaman terakhir dari set baru tanpa menabrak.

Jika Anda hanya mengubah halaman Anda saat ini, Anda mungkin hanya menutupi masalah.

RichardP
sumber
1
plus 1 untuk notifyDataSetChanged ()
madhu527
@Richard Anda menghemat teman saya. 10000+ untuknotifyDataSetChanged()
Ali
15

untuk beralih ke halaman lain, coba dengan kode ini:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);
David Figueroa
sumber
1
Sempurna! Saya mencoba menggunakannya tanpa metode postDelay dan tidak berhasil. Tahukah Anda mengapa metode ini berhasil? Terima kasih! :)
Georgi Koemdzhiev
Pertanyaan yang sama ... mengapa item berubah dengan penundaan ini dan bukan sebaliknya?
Kalyan Raghu
@GeorgiKoemdzhiev Karena pandangan belum selesai saat Anda meneleponviewPager.setCurrentItem
Zohab Ali
3

Jawaban tambahan

Saya awalnya kesulitan mendapatkan referensi ke ViewPagerdari metode kelas lain karena addOnTabSelectedListenermembuat kelas dalam anonim, yang pada gilirannya mengharuskan ViewPagervariabel untuk dideklarasikan final. Solusinya adalah dengan menggunakan variabel anggota kelas dan tidak menggunakan kelas batin anonim.

public class MainActivity extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager viewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 2"));
        tabLayout.addTab(tabLayout.newTab().setText("Tab 3"));
        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);

        viewPager = (ViewPager) findViewById(R.id.pager);
        final PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(), tabLayout.getTabCount());
        viewPager.setAdapter(adapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

        // don't use an anonymous inner class here
        tabLayout.addOnTabSelectedListener(tabListener);

    }

    TabLayout.OnTabSelectedListener tabListener = new TabLayout.OnTabSelectedListener() {

        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    };

    // The view pager can now be accessed here, too.
    public void someMethod() {
        viewPager.setCurrentItem(0);
    }

}
Suragch
sumber