2016-04-22 45 views
0

我想在用戶更改過濾器選項(本例中爲學期)時更改分段的適配器。活動被破壞後,無法更改分段中的適配器

這是我的活動:

My activity

在第一時刻,下面的代碼工作正常:

活動處理學期變化

protected void onChangeSemester(String oldSemester, String newSemester) { 
    super.onChangeSemester(oldSemester, newSemester); 
    if (!oldSemester.equals(newSemester)) { 
     pagerAdapter.setSemester(newSemester); 
    } 
} 

然後我pagerAdapter ...

public void setSemester(String newSemester) { 
    gradesFragment.changeSemester(newSemester, context); 
} 

最後,我的片段

public void changeSemester(String newSemester, Context context) { 
    this.context = context; 
    this.semester = newSemester; 

    if (adapter == null) { 
     adapter = createAdapter(newSemester); 
     setListAdapter(adapter); 
    } 

    adapter.setList(createList(newSemester)); 
} 

但是... 活動後遭到破壞,代碼停止工作。 App dead

然後我的適配器在changeSemester重新創建,但數據不會更新。 我已經嘗試過getListView這樣的:

public void changeSemester(String newSemester, Context context) { 
    this.context = context; 
    this.semester = newSemester; 

    if (adapter == null) { 
     adapter = (GradeListAdapter) getListView().getAdapter(); 
    } 

    adapter.setList(createList(newSemester)); 
} 

但它拋出:

FATAL EXCEPTION: main 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 si.unisanta.tcc.unisantaapp.application.fragments.grade.GradesFragment.changeSemester(GradesFragment.java:110) 
    at si.unisanta.tcc.unisantaapp.application.MainActivityPagerAdapter.setSemester(MainActivityPagerAdapter.java:40) 
    at si.unisanta.tcc.unisantaapp.application.MainActivity.onChangeSemester(MainActivity.java:210) 
    at si.unisanta.tcc.unisantaapp.application.AppCompatActivityToolbarBase$1$1.onClick(AppCompatActivityToolbarBase.java:64) 
    at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:940) 

我做錯了嗎?它看起來像ListView引用丟失,併成爲null,onCreateView沒有再次調用我的片段,所以應該做什麼?有一種方法可以通過重新創建片段或其他東西來修復它?

+0

請你能否詳細說明 「的活動被破壞後,代碼停止工作」? – Pooya

+0

@Pooya我第一次打開我的應用程序,它運作良好。然後通過單擊主頁按鈕關閉它。我打開任何其他應用程序,經過一段時間,我重新打開我的應用程序,它就像我上面寫的那樣出現了錯誤。適配器被銷燬,我無法獲得ListView。 – Latrova

回答

0

我通過不在適配器中維護實例來解決了問題。

我FragmentPagerAdapter:

//More fields... 
private Map<Integer, Fragment> pageReferenceMap = new HashMap<>(); 

@Override 
public Fragment getItem(int position) { 
    switch (position) { 
     case 0: 
      return ClassesFragment.newInstance(); 

     case 1: 
      return TestsFragment.newInstance(); 

     case 2: 
      return GradesFragment.newInstance(semester); 
    } 
    return null; 
} 

@Override 
public Object instantiateItem(ViewGroup container, int position) { 
    Fragment fragment = (Fragment)super.instantiateItem(container, position); 
    pageReferenceMap.put(position, fragment); 
    return fragment; 
} 

@Override 
public void destroyItem(ViewGroup container, int position, Object object) { 
    super.destroyItem(container, position, object); 
    pageReferenceMap.remove(position); 
} 

public void setSemester(String newSemester) { 
    this.semester = newSemester; 
    Fragment gradesFragment = pageReferenceMap.get(GRADES_INDEX); 
    if (gradesFragment != null) { 
     ((GradesFragment)gradesFragment).changeSemester(newSemester); 
    } 
} 

這奏效了