スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ListViewの更新と、カーソルの管理

しおり一覧でアイテムを長押しして、削除した後、

要素の増減を感知して、リストを再表示してくれないかなあ

と適当に調査してみた。


Adapter#managedQueryで、カーソルを取得して、

そのカーソルをもとに、SimpleCursorAdapterで表示しても駄目


なんとなく、Adapter#notifyChangeとか、ContentResolver#notifyChangeでうまくやってくれそうなんだけど。。。

もちろん普通にカーソル取得で、startManagingCursorでも同じ。(内部的にnotifyChangeが呼んでいるのでそりゃそうだ)

ちなみに、managedQueryは何度も呼ぶとまずそうですねぇ・・・

※もちろんArrayAdapterとかシンプルなやつならAdapter更新して、notifyChangeとかうまくいきます)


微妙だ。

というわけで、ContentObserverをもう少し調査

getContentResolver().registerContentObserver(uri, false, new ContentObserver(mHandler){

	@Override
	public void onChange(boolean selfChange) {
			super.onChange(selfChange);
		LogUtil.d("onChange");
	}
		
});

としておくと、notifyChangeやらで受け取れるには受け取れますね。

コンテントプロバイダーを多用するなら覚えておいてよい知識かと。


でも、リスト表示中にListの要素をけして再表示という用途に関しては大げさすぎる。

というわけで見送り。


ただ、manageQueryやらは、カーソルに対して、ライフサイクルに合わせたハンドリングを行なってくれるので

使った方がよさげ。(onDestroyって呼ばれないこともありそうだけど)


requery()も何気に便利だし。


SimpleCursorAdapterだと、idしか取れないので、

選択されたアイテムの情報を取得するためには再度情報を投げないといけないのが嫌なので

独自のAdapter定義しているんだが、

public boolean onItemLongClick(AdapterView<?> parent,
		final View view, int position, long id) {
    ListView list = (ListView) parent;
    Cursor c = (Cursor)list.getItemAtPosition(position);
}

ってカーソルにキャスト出来るんだね。しかも、fromで指定していないカラムもcursorからいける・・・

なんてこった。


やはりソースは読まなきゃ駄目だね。

ContentObserverをもう少し調査してみるかなぁ。と。

関連記事

コメントの投稿

非公開コメント

スポンサードリンク
アプリ一覧
最新記事
最新コメント
最新トラックバック
検索フォーム
月別アーカイブ
カテゴリ
RSSリンクの表示
リンク
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。