2013/02/07

SimpleCursorAdapterのListViewが即座に更新されない時に確認すべき箇所

SimpleCursorAdapterを使っているLIstViewが更新されなくて色々調べたので書く。

問題だったのは、ListViewのアイテムをクリックした時にSQLiteの該当データを削除する機能を実装していたんだけど、押しても即座に更新されなくてどーすんのかなーっと思って調べた。

よくあるのは
mAdapter.notifyDataSetChanged();
とかで更新するってあるけどこれはどうもArrayAdapterだけの時っぽい。

SimpleCursorAdapterのListView更新について
とかも試したけど、Cursor#requery()ってのがUIスレッドでの更新処理なので使うなって怒られたので、これもちがうなーと。

で、さらに調べてたら次の記事を見つけた。

CursorAdapterとContentProviderの関係

どうやら正しいContentProviderを作ってないとSimpleCursorAdapterが変更を検知できないらしい。

で、自分の作ったContentProvider見てみると、ContentProvider#query()で次のコードが抜けてた。
cursor.setNotificationUri(getContext().getContentResolver(), uri);
上のコードをqueryBuilderからcursorを取得した後に書いておかないとダメだった。

作るときに参考にしたサンプルにはちゃんと書かれていたので普通に自分のミスでした。

で、修正すると、即座に更新されるようになった。

他にもありそうなのはContentProvider#insert()とかで
getContext().getContentResolver().notifyChange(uri, null);
とかかな。

0 件のコメント:

コメントを投稿