2012-03-09 14 views
8

私はListActivityにListViewを持っていますが、それはいくつかのデータにバインドされています。私はデータを提供しているコンテンツプロバイダを持っています。Android ListViewライブアップデート

ListActivityは、コンテンツリゾルバを照会することによってデータを取得します。

Uri uri = Uri.parse("content://my.provider.DocumentProvider/mystuff"); 
contentCursor = this.getContentResolver().query(uri, null, null, null, null); 

だから今の活動は、カーソルを持っています。アダプタを作成してリストに追加します。

ListAdapter adapter = new DocumentListCursorAdapter(this, R.layout.main_row_layout, contentCursor, new String[] { "titleColumn" }, new int[] { titleColumnIndex }); 
setListAdapter(adapter); 

これは問題なく動作します。リストにはカーソル内のデータが表示されます。

しかし、コンテンツプロバイダに新しいデータが追加されました。リストを更新して新しいデータを表示したい。

私が見た例では、アダプタのnotifyDataSetChangedの呼び出しが含まれていますが、コンテンツプロバイダーとコンテンツを消費しているリストの間の分離が解消されているようです。

コンテンツプロバイダは、それが彼らのnotifyDataSetChangedメソッドを呼び出すことができますので、カーソルに添付されているものをアダプタに知っておく必要がありますか?あるいは、このように結合されたこれらの2つのものが見えないよりよい方法があります。

+0

http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29を見ましたか? – Luksprog

+0

私はregisterContentObserverで登録しようとしましたが、カーソルが変更されたときに変更が反映されるのを見ませんでした。それはうまくいくはずですか? – stevex

+0

slukianと同じですが、 'contentCursor.setNotificationUri(cr、uri);' – njzk2

答えて

6

..リストに新しいアダプタを設定する代わりにこのコードを入れて、私はここで答えを見つけました: nutshelで

http://mylifewithandroid.blogspot.com/2008/03/observing-content.html

getContext().getContentResolver().notifyChange(uri, null); 
をそしてListActivityが、それは変更の通知を受け取ることに興味を持っていることを登録するには、カーソルの上にsetNotificationUriを呼び出します:

contentCursor.setNotificationUri(getContentResolver(), uri); 

リットル、プロバイダはURIの内容が変更されたことを示すためにnotifyChangeを呼び出します(正しい方向に私を指してくれてありがとうnjzk2)。 prollyあなたのDocumentListCursorAdapterのベースとなるのContentProviderはあなたが(あなたがカーソルを返す前に)CPのごquery実装でcursor.setNotificationUri(getContext().getContentResolver(), uri);を追加し、updategetContext().getContentResolver().notifyChange(uri, null);insertdeleteなければならないあなたです

+0

hehe私の前に数秒 – Selvin

+1

こんにちは、私は同様の問題に取り組んでいます。カスタムBaseAdapterがあり、コンテンツプロバイダから取得したカーソルをアダプタに渡します。あなたのQ&Aに基づいています。もし私が尋ねることがあれば、ドキュメントから 'setNotificationUri' **リゾルバ**に接続されているリスナーに通知します。どのようにこれを使用してリストビューを更新していますか? ContentObserverを使用していませんか? –

+0

URIは単なるメークアップ値ですか? URIが他のアプリのURIと誤って同じではないことを確認するにはどうすればよいですか? –

0

つまり、変更されたデータごとにリストを更新したいとします。そのために
はこれを試してください:あなたが新しいカーソルを得るとき
はその後、ちょうど

adapter.notifyDatasetChanged(); 

listview.invalidate() 
+0

新しいカーソルを取得するタイミングを知るにはどうすればよいですか?データが変更された(たとえば、一部のネットワークアクティビティ - 新しいデータが受信されたため)、コンテンツプロバイダはデータが変更されたことを認識しています。 ListActivityに通知するためにコンテンツプロバイダは何をしていますか? プロバイダーとリストが同じアプリにあると仮定すると、これを解決するのは簡単ですが、コンテンツプロバイダーが別のプロセスのリストに接続されている場合はどうなりますか?コンテンツプロバイダは、リストのどこに変更を伝えるために何をしますか? – stevex

+0

両方を行う必要がありますか、または 'adapter.notifyDatasetChanged()'がListviewを更新しますか? –

1

asuming ... SimpleCursorAdapterはさわやかリストビューについての世話をする必要があります。