1

このコードは正常に動作しています - SimpleCursorAdapter に一連の行をロードしていて、ListView がそれらを表示しています。良い。

SimpleCursorAdapter adapter;
Cursor cursor;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ListView lv = (ListView)findViewById(R.id.main_lv_projects);
    lv.setOnItemClickListener(this);
    String[] columns = new String[] { CompassDataProvider.ORG_NAME };
    int[] names = new int[] { R.id.organisation_row_name};

    cursor = this.managedQuery(CompassDataProvider.CONTENT_URI_ORGANISATIONS, null, null, null, null);
    adapter = new SimpleCursorAdapter(this, R.layout.organisation_row, cursor, columns, names);
    lv.setAdapter(adapter);

    startManagingCursor(cursor);
}

しかし、新しい行を挿入するとき

long rowID = db.getWritableDatabase().insert(CompassDBHelper.ORGS_TABLE_NAME, "", values);
getContext().getContentResolver().notifyChange(CONTENT_URI_ORGANISATIONS, null);
return Uri.withAppendedPath(CONTENT_URI_ORGANISATIONS, ""+rowID);

リストビュー自体が更新されていません-SimpleCursorAdapterに通知され、ビューをリロードできると思いました-そうではありませんか?

新しい行が作成されました-これを確認しました

私が使っているとき

cursor.requery();
adapter.notifyDataSetChanged();

私のUIの脅威では、新しいデータが正しくロードされます...取得できなかったオブザーバー/リスナーのパターンは何ですか? :)

ありがとう、マーティン

4

1 に答える 1

0

カーソルは、参照ではなく値によってSimpleCursorAdapterに渡されます。したがって、cursor.requeryを呼び出しても効果はありません。これを希望どおりに機能させるには、listAdapterを実装し、そこでカーソルを処理する必要があります。

于 2011-06-26T12:38:56.037 に答える