Làm cách nào để thay đổi trang ViewPager's?


150

Tôi đang sử dụng ViewPager trong ứng dụng của mình và xác định nó trong Hoạt động chính. onCreatePhương thức bên trong tôi tải một số trang từ SharedPreferences và sau đó chuyển nó đến PagerAd CHƯƠNG:

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

Vấn đề là nếu tôi thay đổi số này trong Tùy chọn (hoặc Hoạt động khác) thành một số chỉ mục trang khác ít hơn tôi đã xem trước đó, ứng dụng của tôi gặp sự cố vì chỉ mục này vượt quá giới hạn khi tôi quay lại hoạt động với ViewPager này. Nó có thể được sửa một cách đơn giản bằng cách thay đổi trang ViewPager hoạt động. Có cách nào để làm điều đó?

Câu trả lời:


394

Tôi không chắc chắn rằng tôi hoàn toàn hiểu câu hỏi, nhưng từ tiêu đề câu hỏi của bạn, tôi đoán rằng những gì bạn đang tìm kiếm là pager.setCurrentItem( num ). Điều đó cho phép bạn lập trình chuyển sang một trang khác trong ViewPager.

Tôi cần xem dấu vết ngăn xếp từ logcat để cụ thể hơn nếu đây không phải là vấn đề.


3
Vâng, đó chính xác là những gì tôi cần. Tôi đặt nó 0trong onPausephương thức và không có sự cố. Cảm ơn.
La Mã

1
Thực sự có rất ít tài liệu về ViewPager. +1 cho điều đó.
Arnab Chakraborty

1
nếu máy nhắn tin của bạn mất nhiều thời gian để tải trang hơn bạn có thể sử dụng setPackscreenPageLimit (1), bởi vì theo mặc định, xem máy nhắn tin tải trang +1 và -1 từ vị trí hiện tại
Ajay Pandya

Điều này không hoạt động Tôi chỉ nhận được một lỗi nói rằng đoạn đã được thêm vào.
BlondeSwan

24

trượt sang phải

viewPager.arrowScroll (View.FOCUS_RIGHT);

trượt sang trái

viewPager.arrowScroll (View.FOCUS_LEFT);


ngắn gọn và sạch sẽ
dakshbhatt21

1
Tôi gần như tin rằng đây sẽ là câu trả lời được chấp nhận. Nó thực tế hơn nhiều so với việc thiết lập các mục hiện tại.
Peter

18

Không kiểm tra mã của bạn, tôi nghĩ những gì bạn đang mô tả là các trang của bạn không đồng bộ và bạn có dữ liệu cũ.

Bạn nói rằng bạn đang thay đổi số lượng trang, sau đó bị sập vì bạn đang truy cập vào bộ trang cũ. Điều này nghe với tôi như bạn không gọi pageAdapter.notifyDataSetChanged()sau khi thay đổi dữ liệu của bạn.

Khi bạn viewPagerđang hiển thị trang 3 của một bộ gồm 10 trang và bạn thay đổi thành một bộ chỉ có 5, sau đó gọi notifyDataSetChanged(), những gì bạn sẽ thấy là bạn hiện đang xem trang 3 của bộ mới. Nếu trước đây bạn đã xem trang 8 của bộ cũ, sau khi đặt bộ mới và gọi, notifyDataSetChanged()bạn sẽ thấy bạn đang xem trang cuối của bộ mới mà không gặp sự cố.

Nếu bạn chỉ đơn giản là thay đổi trang hiện tại của mình, bạn có thể chỉ che giấu vấn đề.


1
cộng 1 cho thông báoDataSetChanged ()
madhu527

@Richard Bạn tiết kiệm bạn thân ngày của tôi. Hơn 10000 chonotifyDataSetChanged()
Ali

15

để chuyển sang trang khác, hãy thử với mã này:

viewPager.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        viewPager.setCurrentItem(num, true);
    }
}, 100);

1
Hoàn hảo! Tôi đã thử sử dụng nó mà không có phương thức postDelay và nó không hoạt động. Bạn có biết tại sao nó hoạt động với phương pháp này? Cảm ơn! :)
Georgi Koemdzhiev

Cùng một câu hỏi ... tại sao mặt hàng thay đổi với độ trễ này mà không phải là khác?
Kalyan Raghu

@GeorgiKoemdzhiev Vì chế độ xem chưa kết thúc khi bạn gọiviewPager.setCurrentItem
Zohab Ali

3

Bổ sung câu trả lời

Ban đầu tôi gặp khó khăn khi có được một tham chiếu đến ViewPagertừ các phương thức lớp khác bởi vì addOnTabSelectedListenerlớp bên trong ẩn danh, do đó yêu cầu ViewPagerbiến phải được khai báo final. Giải pháp là sử dụng biến thành viên lớp và không sử dụng lớp bên trong ẩn danh.

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);
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.