2012-11-26 37 views
7

Trước hết, tôi đang sử dụng FragmentStatePagerAdapter để nuôi một ViewPager với các đoạn để hiển thị.ViewPager không phải lúc nào cũng làm mới khi setAdapter được gọi, FragmentStatePagerAdapter

Khi ứng dụng ở trạng thái đang hoạt động (tức là sau onResume()), hãy gọi setAdapter trên ViewPager sẽ luôn hoạt động và làm mới ViewPager của tôi, phương thức getItem(int position) trong bộ điều hợp được gọi.

Tuy nhiên sau khi thay đổi định hướng, nếu tôi gọi setAdapter trong phương thức onCreate(Bundle savedInstance) hoạt động của mình, phương thức getItem(int position) không được gọi và đoạn cũ được sử dụng lại.

Tôi nghĩ có lẽ FragmentManager đang làm điều gì đó mà tôi không hiểu? Trình quản lý phân đoạn là thứ duy nhất không bị hủy trong khi thay đổi hướng.

Cảm ơn

+0

Sự cố là SavedState. Tôi có cùng một vấn đề nhưng không có giải pháp. Bạn có thể thử làm theo: befor bạn đặt adapter bộ điều hợp cuộc gọi.saveState, hơn đặt bộ điều hợp và gọi restoreSavedState với trạng thái đã lưu. Trong trường hợp của tôi nó không giúp đỡ, nhưng có thể cho bạn. Lý do: trong SetPager setAdapter nó lưu trạng thái hiện tại và tái sử dụng nó. (tôi nghĩ) – Informatic0re

+1

Tìm câu trả lời đúng ở đây: http://stackoverflow.com/questions/13910826/viewpager-fragmentstatepageradapter-orientation-change – Informatic0re

+0

Điều này có gây ra rò rỉ bộ nhớ không? Nhiều người nói điều đó. Bất kỳ giải pháp khác làm thế nào để xử lý kịch bản này? – pradyumnad

Trả lời

21

Nó có thể là do bạn đang sử dụng getFragmentManager() để nhanh chóng FragmentStatePagerAdapter khi sử dụng mảnh vỡ lồng nhau.

Hãy thử sử dụng getChildFragmentManager() thay vì:

CustomFragmentPagerAdapter fragmentPagerAdapter = new CustomFragmentPagerAdapter(getChildFragmentManager()); 

trả lời đã được tìm thấy here.

+0

Làm việc cho tôi .... – Ganesh

+0

Đó là thông tin rất hữu ích! –

+0

Cảm ơn đã tiết kiệm thời gian của tôi ..! –

1

Đây là điều mà tôi đã phát hiện ra (rất rất kỳ quặc).

Nếu bạn cần refresh mục trong PagerAdapter bạn sẽ chắc chắn nhất không làm như vậy tạo ra trường hợp mới của PageAdapter khi bạn làm vượt qua cùng FragmentManager và chuyển chúng tới các setAdapter tiếng gọi của ViewPager, ví dụ:

FragmentManager fm = getChildFragmentManager(); 
mViewPager.setAdapter(new MyPagerAdapter(fm)); 

hoặc

FragmentManager fm = getActivity().getSupportFragmentManager(); 
mViewPager.setAdapter(new MyPagerAdapter(fm)); 

Nhưng nếu bạn sẽ liên tục chuyển FragmentManager s khi bạn ini tialising PagerAdapter thì nó sẽ hoạt động.

Từ quan điểm của tôi đó là khủng khiếp ... Nếu ai có ý tưởng làm thế nào để làm mới các mục trong ViewPager đúng (và không phải theo cách bẩn này), chia sẻ suy nghĩ của bạn với những người khác :)

0

tôi sử dụng FragmentPagerAdapter và mViewPager.setAdapter() không hoạt động. Tôi sửa nó ở bước dưới đây:
(1) lấy danh sách Fragment hiện tại.

List<Fragment> fragmentList = getSupportFragmentManager().getFragments(); 
List<Fragment> fragmentListCopy = new ArrayList<Fragment>(fragmentList); 

(2) loại bỏ mảnh mamually

//I have two fragment 
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(0)).commit(); 
getSupportFragmentManager().beginTransaction().remove(fragmentList.get(1)).commit(); 

(3) thiết lập FragmentPagerAdapter mới để ViewPager

mViewPager.setAdapter(...) 

Chỉ cần loại bỏ các mảnh vỡ trước khi bạn đặt Adaptor mới.

Các vấn đề liên quan