Adam,

I see in your code below that you're closing the database immediately after querying it (getting the cursor).

This is wrong - a cursor should have an open database to work with.

Also, updates like you're trying to implement are automatic if you use ContentProvider with a CursorAdapter (on the data and UI sides respectively).

Although I'm not familiar with the inner workings on ContentProvider / Resolver framework, maybe we can learn something from the source:

The source for CursorAdapter can be found here:

http://www.netmite.com/android/mydroid/frameworks/base/core/java/android/widget/CursorAdapter.java

It registers a ContentObserver with the cursor and calls cursor.requery() when needed.

On the ContentProvider side, delete() fires off a notification by calling:

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

Based on that, you could try subclassing CursorAdapter, get mChangeObserver (it's protected) and call onChange() to simulate a notifcation normally delivered from ContentProvider.

-- Kostya

14.12.2010 13:10, Serdel пишет:
Hello,

I have a listview and my implementation of the CursorAdapter. As a
part of my list item I have a delete button. When the user presses the
button I show a dialog asking for confirmation and if the user presses
ok I delete the item from the database. The problem is with refreshing
the listview. I tried calling cursor.requery() and
mAdapter.notifyDataSetChanged() (separately or both) but that doesn't
help. Requery clears the list and it re-appears (without the missing
item) after re-entering the activity. notifyDataSetChanged does
nothing (the item is still on the list) and again it is ok after re-
entering the activity. I have managed to make this working after
reloading the whole database:

  //in the dialog:
{
DBAdapter db = new DBAdapter( getApplicationContext() );
db.open();

db.deleteTitle( rowid );

db.close();

//cursor.requery();
//mAdapter.notifyDataSetChanged();

fillData();
}
////////////////////////////////////////

private void fillData() {

                try{
                db.open();
                cursor = db.getAllTitles();
                startManagingCursor(cursor);

                 mAdapter = new MyIDsListCursorAdapters(this, R.layout.myidsrow,
cursor, columns, to);

                setListAdapter(mAdapter);
                db.close();
             }catch (SQLException e){
                showDatabaseErrorDialog ();
             }
         }

But reloading the whole db seems to be a very expensive task and I'm
quite sure there must be a better way to do this.

I also have another problem - my listview items are defined by a
relativelayout. However the layout seems to be ignoring all 'vertical'
attributes, like alignParentBottom or centerVertical. I have seen an
google I/O with Romain Guy and he answered a similar question by
saying we should pass the parent ViewGroup followed by false, to the
inflate function, but that still doesn’t solve my problem. Don’t know
what is going on here. I solved this by placing my items below some
others and playing with the margin/padding but I don’t really like
that solution.



--
Kostya Vasilyev -- WiFi Manager + pretty widget -- http://kmansoft.wordpress.com

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to