1

у меня есть:Динамическое изменение фрагмента содержимого в ViewPager

  • ViewPager с FragmentPagerAdapter на (или FragmentStatePagerAdapter, на самом деле не решить мою проблему).
  • Фиксированное количество фрагментов. Все они имеют один и тот же макет, но имеют TextView s, которые необходимо установить по-разному;
  • AsyncTask, который запрашивает мою базу данных и извлекает содержимое, которое необходимо установить в текстовые элементы.

Так что мой код был:

public class StatsPagerAdapter extends FragmentPagerAdapter { 
    static final int FRAGMENT_COUNT = 5; 
    private Parameters[] sectionData; 

    public StatsPagerAdapter(FragmentManager manager) { 
     super(manager); 
     this.sectionData = new Parameters[FRAGMENT_COUNT]; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return StatsSectionFragment.getInstance(this.sectionData[position]); 
    } 

    @Override 
    public int getCount() { 
     return FRAGMENT_COUNT; 
    } 

    public void setSectionData(int position, Parameters sectionData) { 
     this.sectionData[position] = sectionData; 
     notifyDataSetChanged(); 
    } 
} 

Так я передаю sectionData[position] к getInstance() методу моего родового суб-фрагмента. Эти данные должны различать каждый экземпляр фрагментов, загруженных в ViewPager.

Сначала я буду проездом пустую ссылку, но в моем классе асинхронном:

@Override 
    protected void onProgressUpdate(Parameters... sectionValues) { 
     super.onProgressUpdate(sectionValues); 
     mPagerAdapter.setSectionData(sectionId, sectionValues[0]); 
    } 

Это должно вызвать setSectionData() выше, обновлять sectionData[position] и генерировать вызов notifiyDataSetChanged(). Я надеялся, что это приведет к тому, что адаптер снова загрузит все его элементы, таким образом снова вызовет getItem() и загрузит новые фрагменты.

К сожалению, это не так. Так прямо сейчас:

  • если фрагменты (т.е. getItem()) созданы до моего результата задачи асинхронном опубликованы, этот пункт будет оставаться пустым (т.е. видимый фрагмент, но с пустыми взглядами текста, так как я никогда не называл getInstance(non-null stuff). Это происходит из-за фрагмент 0 & & фрагмент 1.

  • , если фрагменты будут созданы после того, как моя задача асинхронной закончилась (фрагмент 2 до конца, потому что getItem() вызываются только тогда, когда вы достигнете этого фрагмента путем считывания), то первое и только звонок в getItem() производит getInstance(non-null stuff), и все в порядке.

Как я могу перезагрузить содержание в этих уже есть фрагменты, или заставить адаптер для вызова getItem() и обновить свои взгляды?

ответ

1

Добавьте к этому адаптеру:

@Override 
public int getItemPosition(Object object){ 
    return PagerAdapter.POSITION_NONE; 
} 

Это делает ваш адаптер вызов getItem снова, когда вы звоните notifyDataSetChanged();

+0

Постараюсь и пусть вы знаете, спасибо. – natario

+0

Работает только с 'FragmentStatePagerAdapter', но это нормально для меня. – natario

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