6

Sembra che il problema di aggiornamento sia stato discusso in precedenza, ma nessuna delle soluzioni ha funzionato correttamente.Visualizzazione frammento di rinfresco durante l'utilizzo di FragmentStatePagerAdapter

Quello che sto cercando di fare: Sto usando FragmentStatePagerAdapter. Ogni posizione dell'adattatore contiene un frammento che ha un layout lineare che ha l'aspetto di scacchi, con ogni cella rappresentata da un CheckedTextView.

E un listener che dovrebbe ascoltare i clic e rimuove la selezione precedente sulle celle e fa la nuova selezione.

cosa funziona: Ogni frammento è caricato correttamente con tutti i dati/stati predefiniti (calcolato mentre il frammento viene caricato in una lista)

Quando scatto una cella tutti gli stati dall'elenco cellule salvato sono recuperati correttamente e posso cambiare vedere il cambiamento di stato nel codice durante il debug. Allo stesso tempo, assegno un nuovo stato per CheckedTextView che rappresenta una cella. Questo è impostato come:

il problema: Anche se i valori vengono memorizzati ed assegnati correttamente la vista non può essere aggiornata i valori delle celle nella visualizzazione non vengono aggiornati.

punte che ho provato che non ha funzionato: 1. Chiamare adapter.notifyDataSetChanged: può essere chiamato durante l'utilizzo FragmentStatePagerAdapter solo quando abbiamo ignorato:

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

2. Aggiunta Sovrascrivi i metodi per DestroyItem e aggiunge anche i frammenti a una mappa su getItem:

Questo non è appropriato in quanto sto lavorando con FragmentStatePagerAdapter, quindi l'intero scopo di utilizzare questo cercapersone sarebbe andato.

3. Chiamata non valida: Questo non è appropriato per questo scenario, ho bisogno di aggiornamento in tempo reale.

4. metodo setTag() in instantiateItem(): Non penso che sia appropriato in questa situazione.

discussioni referenziati: Refresh images on FragmentStatePagerAdapter on resuming activity

ViewPager PagerAdapter not updating the View

Update ViewPager dynamically?

notifyDataSetChanged fails to update ListView

ho cercato di affermare il mio problema più chiaro possibile, se qualcuno ha bisogno di maggiori chiarimenti, chiedete .

risposte urgenti sarà molto apprezzato,

Acclamazioni

**** ***** Aggiornamento

sto usando la ViewPagerIndicator, invece di quello predefinito ViewPager.

+0

nel setup, cosa rappresenta ciascun frammento? È solo un frammento visualizzato sullo schermo alla volta? Dov'è il codice che hai aggiunto? È all'interno della classe dei frammenti? Infine, cos'è GridRow? –

+0

Ciao Sherif, ogni frammento rappresenta una scacchiera. Ho un'attività che chiama un frammento del contenitore, questo containerFragment ha un viewpager che ha il set FragmentStatePagerAadaper. Ogni elemento dell'adattatore è un frammento e in questo frammento nel suo onCreatView ogni vista di scacchi è inizializzata. Anche l'ascoltatore di una cella si trova nello stesso frammento in cui controllo gli stati correnti e il nuovo stato e modifica lo stato di conseguenza. Una GridRow è solo una riga di checkedTextview che rappresenta una cella. Spero che questo risponda a tutte le tue domande, a eventuali suggerimenti ....? – AliR

+0

Il fatto che tutto avvenga all'interno del tuo frammento significa che non è necessario tutto questo fastidio. Sei sicuro che il tuo selettore (sfondo) sia corretto? Puoi mostrarlo e il tuo xml per ogni cella. Solitamente il caso in cui la vista non viene aggiornata si verifica quando si sta tentando di aggiornare un frammento specifico all'interno del viewpager. –

risposta

0

In relazione alla funzione notifyDataSetChanged(), ho due esperienze diverse.

Quando ho utilizzato la sottoclasse di ArrayAdapter per aggiornare un ListView, ha funzionato correttamente. Quando ho chiamato notifyDataSetChanged(), gli oggetti ListView vengono aggiornati.

Tuttavia, quando ho utilizzato una sottoclasse di FragmentStatePagerAdapter per aggiornare un ViewPager, la chiamata notifyDataSetChanged() non ha funzionato. NotifyDataSetChanged() è responsabile della chiamata alla funzione onChanged() di tutti gli DataSetObserver registrati, ma gli osservatori non sono stati registrati automaticamente come in ArrayAdapter. Devi fare il lavoro di base da solo.

Con mia sorpresa, DataSetObserver non è un'interfaccia ma una classe astratta. Quindi non potevo semplicemente implementarlo nella mia sottoclasse di frammenti. Devo definire una sottoclasse di DataSetObserver, quindi definire un campo membro in questa classe come riferimento al mio frammento, e nella funzione overriden onChanged() aggiornare la visualizzazione View. Il codice è il seguente:

public class DetailFragDataSetObserver extends DataSetObserver { 
private DetailTextFragment view_instance; 
protected static ArrayList<DetailFragDataSetObserver> list = new ArrayList<DetailFragDataSetObserver>(); 

public DetailFragDataSetObserver(DetailTextFragment f){ 
    view_instance = f; 
    list.add(this); 
} 
public DetailTextFragment getView(){ 
    return view_instance; 
} 
public static DataSetObserver findDataSetObserverFor(DetailTextFragment f){ 
    for (int i = 0; i<list.size(); i++){ 
     if (list.get(i).getView() == f) 
      return list.get(i); 
    } 
    return null; 
} 
public static void release(DataSetObserver observer){ 
    list.remove(observer); 
    ((DetailFragDataSetObserver)observer).view_instance = null; 
} 
@Override 
public void onChanged(){ 
    assert null != view_instance; 

    view_instance.vUpdateData(); 
} 
} 

Devi stare attento. È necessario ricordare di annullare il riferimento e annullare la registrazione dell'oggetto DataSetObserver nel proprio overriden framment.onDestroy(), altrimenti il ​​frammento non può essere sottoposto a garbage collection.

In seguito, esaminando i codici sorgente, ho trovato ArrayAdapter e FragmentStatePagerAdapter e non sono fratelli. Sono totalmente diversi. Sono in realtà da diversi pacchetti:

android.widget.ArrayAdapter 
    android.support.v4.app.FragmentStatePagerAdapter 

Ecco perché il primo ha funzionato facilmente mentre il secondo no.

Problemi correlati