Tôi có một số ViewPager
(mở rộng FragmentPagerAdapter
) chứa hai số Fragments
. Những gì tôi cần chỉ là làm mới ListView
cho mỗi Fragment
khi tôi vuốt giữa chúng. Đối với điều này tôi đã thực hiện giao diện ViewPager.OnPageChangeListener
(cụ thể là onPageScrollStateChanged
). Để giữ tham chiếu đến Fragment
, tôi sử dụng HashTable
. Tôi lưu trữ tài liệu tham khảo để Fragments
trong HashTable
trong getItem()
phương pháp:FragmentPagerAdapter không tạo lại Fragments về thay đổi định hướng?
@Override
public Fragment getItem(int num) {
if (num == 0) {
Fragment itemsListFragment = new ItemsListFragment();
mPageReferenceMap.put(num, itemsListFragment);
return itemsListFragment;
} else {
Fragment favsListFragment = new ItemsFavsListFragment();
mPageReferenceMap.put(num, favsListFragment);
return favsListFragment;
}
}
Vì vậy, khi tôi vuốt từ một Fragment
khác các onPageScrollStateChanged
gây nên nơi tôi sử dụng HashTable
để gọi phương thức cần thiết trong cả Fragments
(refresh):
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
Mọi thứ diễn ra tốt đẹp cho đến khi sự kiện orientation change
xảy ra. Sau đó các mã trong refresh()
phương pháp, đó là:
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
kết quả trong IllegalStateException
:
java.lang.IllegalStateException: Content view not yet created
at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
at ebeletskiy.gmail.com.passwords.ui.ItemsFavsListFragment.refresh(ItemsFavsListFragment.java:17)
Giả sử xem Content
không được tạo ra thực sự tôi đặt biến boolean
trong onActivityCreated()
phương pháp để true
và sử dụng if/else
điều kiện để gọi getListView()
hoặc không, hiển thị chế độ xem hoạt động và nội dung được tạo thành công.
Sau đó, tôi đã gỡ lỗi để xem khi nào FragmentPagerAdapter
gọi getItem()
và nó xảy ra phương thức không được gọi sau sự kiện orientation change
. Vì vậy, có vẻ như nó ViewPager
giữ tham chiếu đến cũ Fragments
. Đây chỉ là giả định của tôi.
Vì vậy, có cách nào để thực thi ViewPager
để gọi getItem()
một lần nữa, vì vậy tôi có thể sử dụng tham chiếu thích hợp cho hiện tại Fragments
? Có thể là một số giải pháp khác? Cảm ơn nhiều.
Tôi không sử dụng 'setRetainInstance()' trong đó. Vấn đề là trong trường hợp ngoại lệ bật lên sau 'thay đổi định hướng'. Tôi chỉ giả sử các mảnh vỡ cũ đang được sử dụng, bởi vì tôi đã kiểm tra điều kiện 'onActivityCreated()' được thực hiện cho cả hai. – Eugene
@siik: Khi nào bạn gọi phương thức 'refresh()' này? Và khi nào bạn rút ra những mảnh vỡ mới được tạo ra để điền vào (ick) 'Hashtable' của bạn? – CommonsWare
Tôi đang gọi phương thức 'refresh()' này trong 'onPageScrollStateChanged()' (đang triển khai giao diện 'ViewPager.OnPageChangeListener', tức là khi tôi vuốt giữa' Fragments'). Và tôi cư 'HashTable' trong phương thức' getItem() 'của lớp mở rộng' FragmentPagerAdapter' – Eugene