1

ListView 内のチェックボックスの結果を実際に永続化する方法を説明する単一の記事がどこにも見つかりません。表示方法はたくさんありますが、保存方法はすべて省略されています。

メニュー項目から [お気に入りの設定] をクリックすると、名前のリストを読み込み、それぞれにチェックボックスを表示したいと考えています。複数の「チェック」を実行できるようにしたいのですが、リストを何らかの形式で、チェック済みの設定で、できれば SD カードに永続的なストレージに保存できるようにしたいと考えています。リストには、「name」の値と「isChecked」の値が含まれている必要があります。

私の問題は、構文ではなく構造と範囲の 1 つであると思うので、すべてのコードではなく、構造のみを以下に示します。

メイン メニュー アクティビティで、リスト (checkedlist) をカスタム アダプターに渡します。

public class SetFavourites extends ListActivity {
 /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    .
    .
    FavouritesAdapter adapter = new FavouritesAdapter(this, checkedList);
    setListAdapter(adapter);

}

アダプターには onCheckedChangeListener があるため、チェックボックスが変更されるたびに、//Here's where I'm Stuck と書いた時点で、その行の名前とチェック値が表示されます。

public class FavouritesAdapter extends ArrayAdapter<JSONObject> implements    OnCheckedChangeListener {

@Override
 public View getView(int position, View convertView, ViewGroup parent) {

}

@Override
 public void onCheckedChanged(CompoundButton cb, boolean isChecked) {

    JSONObject checked = getItem(posSelected);

    // Here's where I'm stuck
}


}

だから私の質問は、複数のチェックイベントがある場合、どうすればデータを永続化できますか?

行名とそのチェック済みステータスを保持するモデルを作成する場合、そのモデルをアクティビティから、またはアダプタ内からどこでインスタンス化しますか?

アダプタ内の場合、「チェック」がいつ完了したかを知らせるイベントがないため、モデルに追加することはできますが、保存することはできません。

アダプタがモデルをインスタンス化する場合、メイン アクティビティはどのようにそれを保存できますか? データの保存を完了するために使用できるイベントは何ですか? 戻るボタン メソッド (メイン アクティビティ内で定義されているため、アダプタ内で動作できない)、または Activity onStop() メソッドも同様です。

アクティビティでデータ モデルをインスタンス化して渡すと、どのようにして再度渡されて保存されますか?

ご覧のとおり、私はこれにアプローチする方法に完全に混乱しています。

ありがとう

4

1 に答える 1

1

JSON を使用したことはありませんが、SQLite データベースを使用して同様の状況が発生しました。

そのため、私がどのように対処したかを示す大まかなレイアウトを提供し、JSON ビットを入力してニーズに合わせてください。

カスタム アダプタで配列を設定します。

public static int[] checked;

コンストラクターを用意します。

public FavouritesAdapter(Context context, int layout, Cursor c,
        String[] from, int[] to) {
    super(context, layout, c, from, to);

    initializeChecked();
}

public static void initializeChecked() {
    checked = new int[c.getCount()];
    int i = 0;
    while (i < c.getCount()) {
        checked[i] = 0;
        i++;
    }
}

次に、onCheckedChanged で:

@Override
public void onCheckedChanged(CompoundButton cb, boolean isChecked) {
    if(isChecked == true){
        checked[posSelected] = 1;
    } else {
        checked[posSelected] = 0;
    }
}

次に、リスト外のボタンの onClick で変更をコミットします。

commit.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        int i = 0;
        itemCursor.moveToFirst();  // existing cursor backing the list
        while (itemCursor.isAfterLast() == false) {  // iterate through cursor and match checked with rows
            if (FavouritesAdapter.checked[i] == 1) {
                // do your save to db/file/whatever here
        }
        i++;
        itemCursor.moveToNext();
    }
};

あなたのケースに固有のものではありませんが、うまくいけば役に立ちます。

于 2012-05-11T06:43:23.063 に答える