Ngăn ViewPager phá hủy các chế độ xem ngoài màn hình


133

Tôi có một ViewPager được nối với FragmentPagerAd CHƯƠNG hiển thị ba đoạn. ViewPager xuất hiện để phá hủy chế độ xem của một đoạn được lưu trữ khi nó nằm cách vị trí hiện tại nhiều hơn một lần vuốt.

Các chế độ xem này đều là các danh sách đơn giản và việc tối ưu hóa này là hoàn toàn không cần thiết, vì vậy tôi muốn tắt nó. Nó gây ra một số vấn đề về hình ảnh vì các danh sách có hình động bố cục được áp dụng cho chúng và những hình động đó đang được phát lại sau khi chúng bị phá hủy và được tạo lại. Nó cũng hiển thị hoạt hình giới thiệu thanh cuộn mỗi lần (trong đó thanh cuộn hiển thị nhanh để cho biết có thể cuộn) có thể gây mất tập trung và vị trí cuộn hiện tại của người dùng bị mất trong quá trình.

Nó cũng không tải đoạn thứ ba cho đến khi lần vuốt đầu tiên xảy ra, điều này có vấn đề vì mỗi đoạn xử lý các cuộc gọi dịch vụ riêng của mình và tôi muốn tắt cả ba lần cùng lúc khi hoạt động tải. Có cuộc gọi dịch vụ thứ ba bị trì hoãn là ít hơn lý tưởng.

Có cách nào để thuyết phục ViewPager ngăn chặn hành vi này và chỉ giữ tất cả các mảnh vỡ của tôi trong bộ nhớ?

Câu trả lời:


332

Trong phiên bản 4 của Gói hỗ trợ, một phương thức đã được thêm vào ViewPager cho phép bạn chỉ định số lượng trang ngoài màn hình sẽ sử dụng, thay vì mặc định là 1.

Trong trường hợp của bạn, bạn muốn chỉ định 2, để khi bạn ở trang thứ ba, trang đầu tiên không bị hủy và ngược lại.

mViewPager = (ViewPager)findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(2);

bất kỳ ý tưởng làm thế nào để làm điều này trên một coverflow?
josephus

4
Xin chào. Trong những gì tôi đang làm việc, các đoạn / trang được tạo ra một cách linh hoạt để có số lượng các đoạn có thể xảy ra không xác định. Trường hợp này, nó thường đi đến 10 hoặc ít hơn. Nó sẽ không phải là sử dụng bộ nhớ kém để sử dụng giải pháp này cho nhiều trang đó? Nhân tiện, các mảnh vỡ sẽ chỉ giữ quan điểm. Cảm ơn!
mahkie

Phương thức này đưa ra: "java.lang.IllegalStateException: Fragment đã được thêm:" lỗi cho ứng dụng của tôi.
alicanbatur

Cảm ơn rất nhiều. Nó chỉ thực sự làm việc. Tôi cũng có một vấn đề tương tự như @chefgon.
Prashant

@mahie các giải pháp trên nếu cho Điều này được cung cấp dưới dạng tối ưu hóa. Nếu bạn biết trước số lượng * trang bạn sẽ cần hỗ trợ hoặc có các cơ chế tải lười biếng * trên các trang của bạn, điều chỉnh cài đặt này có thể có lợi ích về độ mượt mà * của hoạt ảnh phân trang và tương tác. Nếu bạn có một số lượng trang nhỏ (3-4) * mà bạn có thể duy trì hoạt động cùng một lúc, sẽ mất ít thời gian hơn trong bố cục cho * lượt xem mới được tạo khi các trang người dùng qua lại
Asthme

8

Theo mặc định, ViewPager tạo lại các đoạn khi bạn vuốt trang. Để ngăn chặn điều này, bạn có thể thử một trong hai điều sau:

1. Trong onCreate () của các đoạn của bạn, hãy gọi setRetainInstance (true).

2. Nếu số lượng đoạn được cố định & tương đối nhỏ, thì trong onCreate () của bạn thêm mã sau đây:

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setOffscreenPageLimit(3);

Nếu tôi nhớ chính xác, tùy chọn thứ hai có triển vọng hơn. Nhưng tôi khuyên bạn nên thử cả hai và xem cái nào trong số chúng hoạt động.


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.