2016-04-22 11 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); 
    } 
} 

这奏效了

相关问题