0

To Do リストを表す SQLite テーブルがあります。各行には、、、_idおよびtitleフラグがありcompletedます。ListView各行にタイトルがあり、フラグにマップされたチェックボックスがありますcompletedCursorAdapterそして、チェックボックスの状態を設定するカスタムがありますbindView。チェックボックスには、OnClick切り替えられたときにデータベースの状態を更新するコールバックがあります。

問題は、ビューが古いカーソル データから再構築されているため、アイテムがスクロールされて画面に戻ると、チェックボックスの状態が失われることです。

ここで推奨される解決策は、データが変更されるたびにカーソルをダンプして再フェッチすることであることを理解しています。これは、痛々しいほど非効率的だと思います。チェックボックスを切り替えると、結果セットで文字通り 1 ビットのデータが変更されました。カーソル全体を捨てるのはやり過ぎのように感じます。

私が試した別の方法は、completedフラグをキャッシュし、アイテムが切り替えられたときにデータベースとキャッシュを更新し、キャッシュをチェックすることbindViewです。これは機能しますが、ぎこちなく感じます。

ここで何か不足していますか?上記よりも良いパターンはありますか?小さな変更が発生するたびにカーソルを期限切れにするコストを過大評価していませんか?

4

1 に答える 1

0

ユーザー入力に基づくカーソル更新の効率については心配しません。これは一定のコストであり、気付かないでしょう。

もう 1 つの方法は、setViewValue をオーバーライドして、それらのチェックボックスを手動で設定することです。以下に、それを行う方法のアイデアを見つけることができます。

public class MyViewBinder implements SimpleCursorAdapter.ViewBinder {

  public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

    int viewId = view.getId();
    switch (viewId) {
        case R.id.flag:

            // Sett the flag based on e.g. an array you have with the states

            return true;
            break;

        default:
            // There is no specific way of showing this, hence go for default
            return = false;
    }
  }
}
于 2013-02-06T14:33:59.550 に答える