Non ho familiarità con FragmentPagerAdapter
, quindi questa sarà una di quelle domande che noi (tu) leggiamo criticamente la descrizione.FragmentPagerAdapter con ViewPager e due frammenti. Vai al primo dal secondo e aggiorna il primo testo
Struttura: Ho un FragmentPagerAdapter
(codice di seguito), che conterrà due frammenti alla volta. Il primo mostra estratti di libri e il secondo un elenco di titoli di libri.
Obiettivo: voglio ottenere ciò che è descritto nel titolo: l'utente può navigare per il secondo frammento nel pager, clicca su un titolo, e poi voglio spostare l'utente di nuovo al primo frammento e dire al primo frammento di aggiornare il testo. Il primo frammento ha un metodo triggerRefresh
per quello.
Codice: Credo che il mio problema si verifichi a causa del modo in cui riordina/crea i frammenti FragmentPagerAdapter
(che non capisco). Questa è la mia classe:
static class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_ITEMS;
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return new ExcerptsFragment();
case 1:
return new BookListFragment();
default:
throw new IllegalArgumentException("not this many fragments: " + position);
}
}
}
Ecco come ho creato i membri rilevanti:
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
MyFragmentPagerAdapter mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
mViewPager.setAdapter(mFragmentPagerAdapter);
E questo è quello che ho provato altrove nella mia attività, quando ricevo la richiamata dai titoli di libri frammento con il titolo selezionato:
mViewPager.setCurrentItem(0); // back to excerpts screen page. It's OK.
// Here's the problem! How to identify the fragment 0
// to ExcerptsFragment and call its triggerRefresh()?!?
serie di problemi:
La chiamata dell'adattatore getView()
non funzionerà perché restituirà una nuova istanza di ExcerptsFragment
, che non è quella attualmente collegata (come previsto, genera l'eccezione).
Ho visto molte persone qui (example) solo memorizzando i frammenti nel getView()
. È giusto? Perché guardando gli esempi ufficiali, mi sembra un anti-modello per me (sconfiggere il riferimento automatico tenendo gli oggetti). E questo è anche il parere here e here (e mi sembra giusto).
Qualche suggerimento? Non sarei sorpreso se non capisco tutto questo un po '...
non si deve fare affidamento sulla compatibilità con il meccanismo interno di assegnazione dei tag. Vedere la mia risposta a una domanda simile a come farlo correttamente: http://stackoverflow.com/questions/14035090/how-to-get-existing-fragments-when-using-fragmentpageradapter/41345283#41345283 – morgwai
@morgwai Grazie per l'avvertimento me. Ho incluso un disclaimer per avvertire i potenziali lettori. – davidcesarino
siete i benvenuti :) Penso comunque sarebbe meglio fornire un link direttamente alla mia risposta (non solo a quella domanda) in quanto la mia risposta è molto nuova e quindi ancora bassa, quindi i lettori potrebbero rimanere bloccati con uno dei 2 migliori ha ottenuto delle risposte, entrambe con problemi. (Ho aggiunto alcune spiegazioni alla mia risposta, perché la soluzione che sovrascrive 'instantiateItem' potrebbe non essere sufficiente) – morgwai