2012-05-11 10 views
0

ListView内のチェックボックスの結果を実際に保持する方法を説明する記事はどこにもありません。たくさんのものを表示する方法を示していますが、それらはすべて保存方法を省いています。リストビューからファイルにチェックされたアイテムを保存する

メニューアイテムから[お気に入りを設定]をクリックすると、名前のリストを読み込んでそれぞれにチェックボックスを表示したいと思います。私は複数のチェックをすることができるようにしたい、そして、チェックされた設定で何らかの形でリストをSDカード上の永続ストレージに保存したいと思っています。リストには「名前」の値と「isChecked」の値が含まれている必要があります

私の問題は構造とスコープのいずれかであると思うので、以下の構造をすべてのコードではなく、むしろメインメニューアクティビティで構文

よりも、私は、カスタムアダプタにリスト(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を持っているので、チェックボックスは、私が持っている時点では、変更されるたびに//ここに私が立ち往生しているところに、その行の名前とチェック値があります

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 
} 


} 

私の質問は、複数のチェックイベントがある場合、どのようにデータを保持できますか?

行の名前とチェックされた状態を保持するモデルを作成すると、そのモデルをアクティビティからインスタンス化するか、またはアダプタからインスタンス化できますか?

アダプタ内に 'checking'が完了したことを通知するイベントはないため、モデルに追加することはできますが、保存はできません。

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

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

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

おかげ

+0

SharedPreferencesを保存したい場合は、それを永続化する方がよいでしょう。また、実装する方が簡単です。 http://developer.android.com/reference/android/content/SharedPreferences.html – FoamyGuy

+0

どのようなデータ型の配列リストにも状態を保存し、それをjson配列に変換し、json文字列を環境設定にシリアル化しますそれはいくつかの巨大なリストではないと仮定して、私はこれをはるかに簡単にするためにGSONを使用します。私はちょうどこれを行うには、アダプタにメソッドを追加します。通常、データを保持する場所は、アクティビティのonPauseです。したがって、adapter.saveState()またはそのようなもの。 – Idistic

答えて

1

私はJSONを使用していないが、私はSQLiteのデータベースを使用して似たような状況を持っています。

多分私はあなたにそれをどのように扱っているかを示す粗いレイアウトを与えることができ、あなたはJSONビットを埋めて、それをあなたのニーズに合わせることができます。配列を設定したカスタムアダプタで

public static int[] checked; 

はコンストラクタを持つ:

あなたonCheckedChangedで次に
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++; 
    } 
} 

@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(); 
    } 
}; 

あなたのケースには関係ありませんが、うまくいけば役立つでしょう。

+0

この回答は、「静的な」クラス変数とコンストラクタを完全に理解していないという「ログジャム」を克服するのに十分に近いものでした。私はそれを整えると、自分のコードを投稿します。 – Mitch

+0

うれしいことに、私は助けてくれました...私はそれがJSONを使ってどのように関係しているのかよく分かりませんでしたが、基本はいくぶん同じでなければならないようです。私はあなたのコードを見ることを楽しみにしています。新しいことを教えてくれるはずです。 – Barak

関連する問題