2016-03-24 12 views
3

Ich benutze eine ListView mit einem PullToRefresh-Mechanismus mit SwipeRefreshLayout. Ich füge das SwipeRefreshLayout dynamisch in Code zur ListView hinzu, wenn ich initialisiere.ListView verschwindet vor dem Aktualisieren selbst, wenn ich zum Aktualisieren

SwipeRefreshLayout swipeRefreshLayout = new SwipeRefreshLayout(listView.getContext()); 

if (listView.getParent() != null) { 
    final ViewGroup parent = (ViewGroup) listView.getParent(); 
    final int index = parent.indexOfChild(listView); 
    parent.removeViewAt(index); 
    parent.addView(swipeRefreshLayout, index); 
    listView.setVisibility(View.VISIBLE); 
} 

swipeRefreshLayout.addView(listView); 
swipeRefreshLayout.setOnRefreshListener(...) { } 

Der obige Code fügt die swipeRefreshLayout des Mutter (an der Position, die die Listenansicht ist derzeit in), und fügt dann die Listenansicht als Kind des swipeRefreshLayout.

Wenn ich auffrischen, wird ein Netzwerkaufruf gemacht - Daten werden abgerufen, in der DB gespeichert und mit einem CursorAdapter geladen.

Das Problem:

Wenn ich ziehen zu aktualisieren, sehe ich einen leeren Bildschirm für eine Sekunde und die UI aktualisiert sich mit allen Einzelteilen. Aber wenn der leere Bildschirm angezeigt wird und ich den Bildschirm berühre, reagiert er auf Klickereignisse und das ListView wird sofort angezeigt.

Ich brauche die ListView, um während des Abrufens der Daten die ganze Zeit anzuzeigen (während die PTR-Ansicht angezeigt wird) und aktualisiert sofort, wenn neue Daten verfügbar sind.

Gibt es etwas, was ich falsch mache? Ich habe versucht, setRefreshing auf "true" zu setzen, indem ich einen runable auf SwipeRefreshLayout posten und neue Daten abrufen konnte. Ich denke nicht, dass dies etwas mit dem Datenabruf zu tun hat.

Der Adapter wird nicht geändert, während der leere Bildschirm angezeigt wird (was bedeutet, dass der ListView immer noch sichtbar sein sollte).

Irgendwelche Ideen?

Antwort

2

Sie entfernen die Ansicht und fügen sie erneut hinzu. Der Adapter sollte dafür sorgen, dass die neuen Daten neu gezeichnet werden. Entfernen Sie nicht die Ansicht, sondern rufen Sie notifyDataSetChanged() auf dem Adapter auf, wenn Sie die Daten aktualisieren und die Daten bereit sind.

+0

Ich habe meinen Code so geändert, dass er das SwipeRefreshLayout in XML enthält, anstatt es dynamisch hinzuzufügen, und ich sehe immer noch das Problem. – sr09

Verwandte Themen