How to update ListView in case of CursorAdapter usage?
Asked Answered
B

6

17

The reason I'm asking that is because requery() is deprecated. What is the best way now to refresh your ListView?

Bradstreet answered 11/8, 2011 at 13:28 Comment(0)
E
37

requery() updates a Cursor, not a CursorAdapter. As you say, it has been deprecated, and its replacement is:

oldCursor = myCursorAdapter.swapCursor(newCursor); // hands you back oldCursor

or:

myCursorAdapter.changeCursor(newCursor); // automatically closes old Cursor

myCursorAdapter.notifyDataSetChanged() notifies the ListView that the data set has changed, and it should refresh itself

Emee answered 11/8, 2011 at 13:39 Comment(3)
Is it always necessary to call notifyDataSetChanged() in onLoadFinished and onLoaderReset?Shamanism
I've seen a piece of code that doesn't use notifyDataSetChanged for a SimpleCursorAdapter and a ListView. If possible, do explain when notifyDataSetChanged needs to be called and why my example case doesn't need it.Dennard
There is no need to call notifyDataSetChanged() on CursorAdapter after either changeCursor() or swapCursor() calls - both methods call this method themselves, therefore your call will become just an overhead.Eau
R
0

Use BaseAdapter.notifyDataSetChanged().

Ripping answered 11/8, 2011 at 13:32 Comment(0)
R
0

You can create a new cursor and call changeCursor() (documentation here) on your CursorAdapter instance or call notifyDataSetChanged() (documentation here) on your adapter.

Radley answered 11/8, 2011 at 13:37 Comment(3)
I think your answer is misleading - changeCursor and notifyDataSetChanged are not interchangable, they do different jobs.Emee
True and one should consider which is best for the given situation, but both will "refresh" the list view.Radley
So they don't need to be called together? Just calling one cancels out the need for calling the other?Shamanism
A
0

This is what works for me, im not sure its the best way.

c = db.rawQuery( "SELECT * FROM mytable", null); //same line of the first initialization
adapter.swapCursor(c);

I refresh the only cursor, I dont know what to do with a new one. Also i dont know pepole that answer with only a name of a function.

Aleece answered 27/8, 2014 at 13:59 Comment(0)
S
0

The only thing that helped me, was to initialise new cursor, similar as previous one like:

cursor = dbHelper.myDataBase.rawQuery(StaticValues.SQL_CAT, null);

newCursor = dbHelper.myDataBase.rawQuery(StaticValues.SQL_CAT, null);

and then call:

adapter.changeCursor(newCursor);

that updated my listview.

Saransarangi answered 5/9, 2017 at 18:1 Comment(0)
P
0

I tried to add my response as a comment but failed for some reason.

cursoradapter.notifyDatasetchanged() should not work as your adapter is linked to a "cursor" which holds a "query" that was executed before dataset was changed. Hence one would require to change "cursor" by doing the "new query" and link to cursoradapter using cursoradapter changecursor().

Premer answered 23/4, 2019 at 6:9 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.