6

Scheint, dass das Aktualisierungsproblem zuvor besprochen wurde, aber keine der Lösungen funktionierte für mich.Fragmentierungsansicht während der Verwendung von FragmentStatePagerAdapter aktualisieren

Was ich versuche zu tun: Ich benutze FragmentStatePagerAdapter. Jede Position des Adapters enthält ein Fragment mit einem linearen Layout mit schachähnlichem Aussehen, wobei jede Zelle durch eine CheckedTextView dargestellt wird.

Und ein Listener, der auf Klicks hört und die vorherige Auswahl auf den Zellen entfernt und die neue Auswahl trifft.

Was Arbeits: Jedes Fragment geladen wird korrekt mit allen Daten/Standardzuständen (berechnet, während das Fragment in einer Liste geladen wird)

Wenn ich eine Zelle klicken, um alle die Zustände aus der Liste gespeichert Zellen werden korrekt abgerufen und ich kann die Statusänderung im Code während des Debuggens ändern. Gleichzeitig weise ich der CheckedTextView einen neuen Zustand zu, der eine Zelle repräsentiert. Dies wird wie:

Das Problem: Auch wenn die Werte werden gespeichert und zugeordnet richtig die Ansicht nicht die Werte der Zellen in der Ansicht aktualisiert nicht aktualisiert.

Tipps Ich habe versucht, die nicht gearbeitet haben: 1. Rufen Sie adapter.notifyDataSetChanged: Kann während nur mit FragmentStatePagerAdapter aufgerufen werden, wenn wir außer Kraft gesetzt haben:

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

2. Hinzufügen Überschreiben Sie Methoden für DestroyItem und fügen Sie auch die Fragmente zu einer Map auf getItem hinzu:

Dies ist nicht geeignet, da ich mit arbeite FragmentStatePagerAdapter, so dass der ganze Zweck der Verwendung dieses PagerAdapters weg wäre.

3. Berufung invalidate: Das für dieses Szenario nicht geeignet ist, muss ich Echtzeit-Refresh.

4. setTag() -Methode in instantiateItem(): Ich glaube nicht, das in dieser Situation angemessen ist.

referenzierte Themen: Refresh images on FragmentStatePagerAdapter on resuming activity

ViewPager PagerAdapter not updating the View

Update ViewPager dynamically?

notifyDataSetChanged fails to update ListView

ich versucht habe, meine Frage so klar wie möglich zu erklären, wenn jemand mehr Klärung bedarf, fragen .

Urgent Antworten werden sehr geschätzt,

Prost

**** aktualisieren *****

ich den ViewPagerIndicator verwenden, anstelle des Standard-ViewPager.

+0

in Ihrem Setup, was jedes Fragment darstellt? Ist immer nur ein Fragment auf dem Bildschirm zu sehen? Wo ist der Code, den du hinzugefügt hast? Befindet es sich in der Fragmentklasse? Was ist GridRow? –

+0

Hallo Sherif, jedes Fragment repräsentiert ein Schachbrett. Ich habe eine Aktivität, die ein Containerfragment aufruft. Dieses containerFragment hat einen Viewpager, in dem der FragmentStatePagerAadaper gesetzt ist. Jedes Adapterelement ist ein Fragment, und in diesem Fragment wird in seiner onCreatView jede Schachansicht initialisiert. Auch der Listener für eine Zelle befindet sich im selben Fragment, wo ich nach aktuellen Zuständen und neuem Zustand suche und den Zustand entsprechend ändere. Ein GridRow ist nur eine Zeile von checkedTextview, die eine Zelle darstellt. Ich hoffe das beantwortet all deine Fragen, Hinweise ...? – AliR

+0

Die Tatsache, dass alles in Ihrem Fragment passiert, bedeutet, dass all dieser Ärger nicht benötigt wird. Sind Sie sicher, dass Ihr Selektor (Hintergrund) korrekt ist? Können Sie es und Ihre XML für jede Zelle zeigen. Normalerweise passiert der Fall, wenn die Ansicht nicht aktualisiert wird, wenn Sie versuchen, ein bestimmtes Fragment innerhalb des Viewpagers zu aktualisieren. –

Antwort

0

In Bezug auf die Funktion notifyDataSetChanged() habe ich zwei verschiedene Erfahrungen.

Als ich meine Unterklasse von ArrayAdapter verwendet, um ein ListView zu aktualisieren, funktionierte es gerade. Wenn ich notifyDataSetChanged() anrief, werden die ListView-Elemente aktualisiert.

Wenn ich jedoch eine Unterklasse von FragmentStatePagerAdapter verwendet, um einen ViewPager zu aktualisieren, funktionierte der Aufruf von notifyDataSetChanged() nicht. NotifyDataSetChanged() ist verantwortlich für den Aufruf der onChanged() - Funktion aller registrierten DataSetObserver, aber die Beobachter wurden nicht wie in ArrayAdapter automatisch registriert. Sie müssen die Bodenarbeit selbst erledigen.

Zu meiner Überraschung ist DataSetObserver keine Schnittstelle, sondern eine abstrakte Klasse. Also konnte ich es nicht einfach in meine Unterklasse von Fragment implementieren. Ich muss eine Unterklasse von DataSetObserver definieren, dann ein Member-Feld in dieser Klasse als Referenz auf mein Fragment definieren und in der Oncunden onChanged() -Funktion Ihre Ansicht aktualisieren. Der Code lautet wie folgt:

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(); 
} 
} 

Sie müssen vorsichtig sein. Sie müssen daran denken, den Verweis auf Null zu setzen und das DataSetObserver-Objekt in Ihrem überschriebenen Fragment.onDestroy() aufzulösen, andernfalls kann das Fragment nicht als Garbage Collected erfasst werden.

Später, durch den Blick in den Quellcode, fand ich ArrayAdapter und FragmentStatePagerAdapter und sind keine Geschwister. Sie sind total verschieden. Sie sind tatsächlich aus verschiedenen Paketen:

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

Deshalb der erste funktionierte leicht, während letzteres nicht funktioniert.

Verwandte Themen