Aktualisieren Sie SimpleCursorAdapter, während Sie die Bildlaufposition in ListView beibehalten

9

Mein Problem: Mein ListView setzt seine Scroll-Position nach oben, wenn ich den Inhalt über den (angepassten) SimpleCursorAdapter aktualisiere. Ich möchte, dass das ListView seine Scroll-Position bei der Aktualisierung behält.

Ich begann, indem Sie einen neuen Adapter beispielsweise jedes Mal, und mit ListView.setAdapter() zu schaffen, sondern nach diese Diskussion Ich sollte den Adapter aktualisieren, anstatt ihn zurückzusetzen. Ich kann keinen Weg finden, dies für SimpleCursorAdapter zu tun, das richtig funktioniert.

Hier sind einige Dinge, die ich ausprobiert habe, wobei die Argumente der Methode weggelassen wurden:
- SimpleCursorAdapter.changeCursorAndColumns() mit einem neuen Cursor aktualisiert den Adapter erfolgreich, setzt aber die Bildlaufposition zurück.
- SimpleCursorAdapter.changeCursor() verhält sich genauso.
- SimpleCursorAdapter.swapCursor() ist nicht verfügbar bis api 11, und ich entwickle für api 8.
- SimpleCursorAdapter.notifyDataSetChanged() aktualisiert das ListView nicht. (Vielleicht gibt es noch einen weiteren Schritt.) - ListView.invalidate() aktualisiert das ListView nicht.
- SimpleCursorAdapter.requery() macht das ListView leer und ist veraltet.
- Ich kenne die Lösung ListView.setSelection() , aber ich möchte nicht, dass sich mein ListView bei der Aktualisierung bewegt. Dadurch wird es an einer Position in der Liste gefangen.

Dies scheint ein häufiges und einfaches Problem zu sein. Hat sich jemand damit beschäftigt?

    
pvans 13.02.2012, 05:07
quelle

2 Antworten

5

Ich hatte ein ähnliches Problem: Mein CursorAdapter hat die Bildlaufposition zurückgesetzt, wenn sich der Inhalt des Cursors geändert hat.

Ich habe nicht bemerkt, dass ich jedes Mal, wenn sich die Daten geändert haben, einen neuen Listenadapter gesetzt habe. Ich dachte, der Cursor selbst würde den Adapter über Änderungen seines Inhalts informieren, aber in meinem Fall löst der ContentProvider LoaderManager.LoaderCallbacks.onLoadFinished () in meinem ListFragment aus. In diesem Callback benutze ich nun CursorAdapter.changeCursor () anstatt einen neuen Adapter zu erstellen und alles funktioniert gut.

Ich hoffe, das hilft bei der Lösung Ihres Problems.

    
Oderik 22.02.2012, 20:01
quelle
0

Habe das selbe in der post execute von Async Task verwendet folgenden Code funktionierte für mich

%Vor%

wobei CursorAdapter eine globale Variable ist

    
Amandeep Singh 19.07.2015 22:16
quelle