나는 ViewPager
(extend FragmentPagerAdapter
)에 두 개의 Fragments
을 보유하고 있습니다. 내가 슬쩍 할 때마다 Fragment
에 대해 ListView
을 새로 고치면됩니다. 이를 위해 ViewPager.OnPageChangeListener
인터페이스 (즉, onPageScrollStateChanged
)를 구현했습니다. Fragment
에 대한 참조를 보유하려면 HashTable
을 사용합니다. 나는 getItem()
방법 HashTable
에 Fragments
에 대한 참조를 저장 :FragmentPagerAdapter가 방향 변경시 조각을 다시 생성하지 않습니까?
@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;
}
}
내가 다른 하나 Fragment
스 와이프 때 모두 Fragments
(새로 고침)에 필요한 메서드를 호출 HashTable
를 사용하는 경우 그래서 onPageScrollStateChanged
트리거 :
public void refreshList() {
((ItemsListFragment) mPageReferenceMap.get(0)).refresh();
((ItemsFavsListFragment) mPageReferenceMap.get(1)).refresh();
}
orientation change
이벤트가 발생할 때까지 모든 것이 잘됩니다. IllegalStateException
에
public void refresh() {
mAdapter.changeCursor(mDbHelper.getAll());
getListView().setItemChecked(-1, true); // The last row from a exception trace finishes here (my class).
}
결과 :
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)
가 Content
보기 제가 true
에 onActivityCreated()
방법에서 boolean
변수를 설정하고 if/else
사용 실제로 생성되지 가정되는 코드 refresh()
방법에있어서, 후 조건 getListView()
으로 전화를 걸면 활동 및 콘텐츠보기가 성공적으로 생성되었음을 알 수 있습니다.
그럼 FragmentPagerAdapter
이 getItem()
을 호출 할 때 디버깅 중이며 orientation change
이벤트 이후에 메소드가 호출되지 않습니다. 따라서 ViewPager
에는 이전 Fragments
에 대한 참조가 저장됩니다. 이것은 단지 나의 가정입니다.
그럼 ViewPager
을 다시 getItem()
으로 호출 할 수있는 방법이 있습니까? 현재 Fragments
에 대한 적절한 참조를 사용할 수 있습니까? 다른 해결책이있을 수 있습니까? 고맙습니다.
거기에'setRetainInstance()'를 사용하지 않습니다. 문제는 '오리엔테이션 변경'후에 나타나는 팝업 예외입니다. 난 단지'onActivityCreated()'가 양쪽 모두에 대해 실행되는 조건을 검사했기 때문에 이전의 Fragments가 사용되고 있다고 가정합니다. – Eugene
@siik :이 refresh() 메소드는 언제 호출합니까? 그리고 언제 새롭게 생성 된 파편을 꺼내서 (해) '해시 테이블'을 채우고 있습니까? – CommonsWare
'onPageScrollStateChanged()'('ViewPager.OnPageChangeListener' 인터페이스의 구현입니다. 즉,'Fragments' 사이에서 스 와이프 할 때)에서이'refresh()'메소드를 호출하고 있습니다. 그리고'FragmentPagerAdapter'를 확장 한 클래스의 getItem() 메소드에서'HashTable'을 채 웁니다. – Eugene