2009-12-05 3 views
8

Ich habe einen ListView, der einen CursorAdatper als Adapter verwendet. Ich möchte die Listenansicht müssenWie aktualisiert man einen ListView, um den Cursor erneut aufzufüllen, um seine Daten und seine Ansichten neu zu füllen

  • requery seine Daten
  • seiner Ansicht aktualisieren, sobald die erneute Abfrage erfolgt.

Ich habe versucht:

CursorAdapter adapter = (CursorAdapter)listView.getAdapter(); 
adapter.notifyDataSetChanged(); 

und ich versuchte:

CursorAdapter adapter = (CursorAdapter)listView.getAdapter(); 
adapter.getCursor().requery(); 

aber keiner arbeitete. Ich habe in meiner Abfrage-Methode ContentProvider einen Haltepunkt festgelegt, aber ich sehe nicht, dass die Abfrage aufgerufen oder meine ListView mit neuen Daten aktualisiert wird.

Können Sie mir bitte sagen, was die Lösung für mein Problem ist?

Vielen Dank.

Antwort

16

Aufruf requery() auf einer Datenbank oder Content-Provider Cursor an ListView über ein CursorAdapter aktualisiert automatisch die Liste (Ihr zweites Szenario oben). Sie können someexamples davon sehen. Wenn das nicht für Sie funktioniert, könnte es einen Fehler in Ihrem ContentProvider oder Adapter geben.

+0

Vielen Dank für Ihre Hilfe. – hap497

+0

es funktioniert, aber wie sieht es mit der Leistung aus? Requery ist einfach zu bedienen, aber ich weiß nicht, ob es gut ist. – Emerald214

+9

requery ist jetzt als veraltet gekennzeichnet und es gibt sogar eine kleine Notiz, die es in der SDK begleitet. Was ist der beste Weg, dies jetzt zu tun, ist es cool, noch Requery zu verwenden? – marchinram

5

können Sie versuchen: adapter.changeCursor (neuer Cursor). Es funktioniert für mich

+0

hat auch für mich funktioniert. eine Notiz an andere Programmierer hier. Dieser changCursor() muss im UI-Thread aufgerufen werden. Ich stürzte ab, wenn der Anruf von Hintergrundthread –

11

In der neuen API (loader-Manager) Sie verwenden können:

getLoaderManager().getLoader(_YOUR_LOADER_ID_).forceLoad(); 
+4

kommt Eine Option ist auch getLoaderManager(). RestartLoader(); – Anderson

+1

@Anderson mit 'restartLoader' müssen Sie die Argumente und Callbacks erneut liefern,' getLoader' basiert nur auf der ID. – TWiStErRob

4

Ich weiß, diese Antwort wahrscheinlich zu spät ist, aber zu ihrer Information an andere, wenn Sie einen Cursor Loader verwenden (wie das solltest du wahrscheinlich tun), mach einfach

getContext(). getContentResolver(). notifyChange (uri, null);

wo uri ist das gleiche uri für den Cursor Loader verwendet.

Verwandte Themen