4

私がやろうとしているのはListView、内部SQLiteデータベースを使用してデータを取得するアプリを配置することです。ユーザーがクリックすると、新しいクエリを実行して新しいデータがDBからフェッチされます。

インターフェイスListViewを拡張LinearLayoutおよび実装するアイテムのカスタムビューを実装しました。Checkable動作します。

に基づいたカスタムアダプタを入手しましたCursorAdapter。空のカーソルでアダプタOnCreate()を設定しています。ListView

ListView markersList = (ListView) findViewById(R.id.markersList);

Cursor c = null;
MarkersListAdapter adapter = new MarkersListAdapter(this, c, 0);
markersList.setAdapter(adapter);

次に、更新するために新しいカーソルを渡すAsyncTaskデータベースをクエリしています。私はこれを次のように行っています:doInBackground()onPostExecute()ListView

adapter.changeCursor(newCursor);

次に、デフォルトですべてのアイテムをチェックしています(ユーザーは不要なアイテムのチェックを外すだけです)

for(int i = 0; i < this.markersList.getCount(); i++)
{        
    this.markersList.setItemChecked(i, true);
}

ここまでは順調ですね。しかし、私がするとき

int s = this.markersList.getCheckedItemCount();

間違った値を取得しています。古いカーソルに関連付けられていると思います。これは、新しいカーソルの行数が新しいカーソルの行数よりも少ない場合にのみ発生します。

一般的に、私はこのようなものを手に入れています

int s = this.markersList.getCheckedItemCount();   // s = 7
int d = this.markersList.getCount();              // d = 5

これに対する解決策はありますか?

4

1 に答える 1

3

最も簡単な解決策は、チェックされたカウントを手動でクリアすることです。

this.markersList.clearChoices();
for(int i = 0; i < this.markersList.getCount(); i++)
{        
    this.markersList.setItemChecked(i, true);
}
于 2012-11-24T22:52:15.627 に答える