2016-04-22 4 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 потеряна и становится нулевой, 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); 
    } 
} 

И что сделал трюк

Смежные вопросы