Sto usando il ViewPager di compatibilità v4 in Android. My FragmentActivity ha un sacco di dati che devono essere visualizzati in modi diversi su pagine diverse nel mio ViewPager. Finora ho solo 3 istanze dello stesso ListFragment, ma in futuro avrò 3 istanze di ListFragment differenti. ViewPager si trova su uno schermo del telefono verticale, gli elenchi non sono affiancati.
Ora un pulsante su ListFragment avvia un'attività a tutta pagina separata (tramite FragmentActivity), che restituisce e FragmentActivity modifica i dati, li salva, quindi tenta di aggiornare tutte le viste nel suo ViewPager. È qui, dove sono bloccato.
public class ProgressMainActivity extends FragmentActivity
{
MyAdapter mAdapter;
ViewPager mPager;
@Override
public void onCreate(Bundle savedInstanceState)
{
...
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.viewpager);
mPager.setAdapter(mAdapter);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
...
updateFragments();
...
}
public void updateFragments()
{
//Attempt 1:
//mAdapter.notifyDataSetChanged();
//mPager.setAdapter(mAdapter);
//Attempt 2:
//HomeListFragment fragment = (HomeListFragment) getSupportFragmentManager().findFragmentById(mAdapter.fragId[0]);
//fragment.updateDisplay();
}
public static class MyAdapter extends FragmentPagerAdapter implements
TitleProvider
{
int[] fragId = {0,0,0,0,0};
public MyAdapter(FragmentManager fm)
{
super(fm);
}
@Override
public String getTitle(int position){
return titles[position];
}
@Override
public int getCount(){
return titles.length;
}
@Override
public Fragment getItem(int position)
{
Fragment frag = HomeListFragment.newInstance(position);
//Attempt 2:
//fragId[position] = frag.getId();
return frag;
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE; //To make notifyDataSetChanged() do something
}
}
public class HomeListFragment extends ListFragment
{
...
public static HomeListFragment newInstance(int num)
{
HomeListFragment f = new HomeListFragment();
...
return f;
}
...
Ora, come puoi vedere, il mio primo tentativo è stato quello di notificareDataSetChanged sull'intero FragmentPagerAdapter, e questo ha mostrato di aggiornare i dati a volte, ma altri ho ottenuto IllegalStateException: Impossibile eseguire questa azione dopo onSaveInstanceState.
Il mio secondo tentativo ha comportato il tentativo di chiamare una funzione di aggiornamento nel mio ListFragment, ma getId in getItem ha restituito 0. Secondo i documenti che ho provato da
acquisizione di un riferimento al frammento da FragmentManager, utilizzando findFragmentById () o findFragmentByTag ()
ma non conosco il tag o l'id dei miei frammenti! Ho un android: id = "@ + id / viewpager" per ViewPager e un android: id = "@ android: id / list" per il mio ListView nel layout ListFragment, ma non penso che siano utili.
Quindi, come posso: a) aggiornare l'intero ViewPager in modo sicuro in una sola volta (idealmente riportando l'utente alla pagina in cui si trovava prima) - è ok che l'utente veda la vista cambiare. O preferibilmente, b) chiamare una funzione in ciascun ListFragment interessato per aggiornare ListView manualmente.
Qualsiasi aiuto sarebbe accettato con gratitudine!
null
frammento.