2011-06-24 22 views
5

複数選択リストビューのチェックボックスの状態を保存します。私は次のレイアウトを持っています。私は何をしたいか複数選択ListViewおよびSharedPreferences

enter image description here

例えば、「TEST1とTEST3」、の状態を保存することであり、私はこの活動に戻ったとき、このcheckboxsがチェックされます。私は共有の設定を使用しています。私は次のコードを持っています。

これは私のリストをロードします。

mList = (ListView) findViewById(R.id.ListViewTarefas);  
    final TarefaDbAdapter db = new TarefaDbAdapter(this); 
    db.open(); 
    data = db.getAllTarefas(getIntent().getExtras().get("nomeUtilizadorTarefa").toString()); 
    adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,data); 
    mList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    mList.setAdapter(adapter); 
    LoadSelections(); 

、これは次のコードをロードし、checkboxs(たぶん)の状態を保存します。

@Override 
protected void onPause() { 
    // always handle the onPause to make sure selections are saved if user clicks back button 
    SaveSelections(); 
    super.onPause(); 
} 

private void ClearSelections() { 
    // user has clicked clear button so uncheck all the items 
    int count = this.mList.getAdapter().getCount(); 
    for (int i = 0; i < count; i++) { 
     this.mList.setItemChecked(i, false); 
    } 
    // also clear the saved selections 
    SaveSelections(); 
} 

private void LoadSelections() { 
    // if the selections were previously saved load them 
    SharedPreferences settingsActivity = getPreferences(MODE_PRIVATE); 
    if (settingsActivity.contains(data.toString())) { 
     String savedItems = settingsActivity.getString(data.toString(), ""); 
     this.data.addAll(Arrays.asList(savedItems.split(","))); 
     int count = this.mList.getAdapter().getCount(); 
     for (int i = 0; i < count; i++) { 
      String currentItem = (String) this.mList.getAdapter().getItem(i); 
      if (this.data.contains(currentItem)) { 
       this.mList.setItemChecked(i, true); 
      } 
     } 
    } 
} 


private void SaveSelections() { 
    // save the selections in the shared preference in private mode for the user 
    SharedPreferences settingsActivity = getPreferences(MODE_PRIVATE); 
    SharedPreferences.Editor prefEditor = settingsActivity.edit(); 
    String savedItems = getSavedItems(); 
    prefEditor.putString(data.toString(), savedItems); 
    prefEditor.commit(); 
} 


private String getSavedItems() { 
    String savedItems = ""; 
    int count = this.mList.getAdapter().getCount(); 
    for (int i = 0; i < count; i++) { 
     if (this.mList.isItemChecked(i)) { 
      if (savedItems.length() > 0) { 
       savedItems += "," + this.mList.getItemAtPosition(i); 
      } else { 
       savedItems += this.mList.getItemAtPosition(i); 
      } 
     } 
    } 
    return savedItems; 
} 

ボタンでSaveSelectionsメソッドとClearSelectsメソッドをロードするよりも、

問題はこれが機能していないことです。誰かが私を助けてくれる?

よろしくお願いいたします。

+0

コードにいくつかのログを書き込もうとしましたか?たとえば、settingsActivity.contains(data.toString())はtrueを返しますか? getString()メソッドを使用してStringを取得するにはどうすればよいですか? – Egor

+0

こんにちは。問題は、このアクティビティで再度入力すると、存在する値よりも多くの値が追加され、すべてのチェックボックスがtrueに設定されるということです。 – unnamed

+0

次に、既存の値を上書きする必要があります。つまり、既存のキーの下に保存する必要があります。 – Egor

答えて

1

最近、同様の問題が発生しました。これは、ListView内のアイテムがリサイクルされているためです(プロパティとすべて)。保存されなかったものを未チェックの状態に明示的に設定する必要があります。

EDIT: また、私は誤解かもしれないがそれはあなたのアダプタがあなたのリストを生成するために使用しているものだから、私はあなたが「データ」に保存された文字列を追加する必要があるとは思わない、それはないですか?

private void LoadSelections() { 
    // if the selections were previously saved load them 
    SharedPreferences settingsActivity = getPreferences(MODE_PRIVATE); 
    if (settingsActivity.contains(data.toString())) { 
     String savedItems = settingsActivity.getString(data.toString(), ""); 
     ArrayList<String> savedItemsList = (ArrayList<String>) Arrays.asList(savedItems.split(",")); 
     int count = this.mList.getAdapter().getCount(); 
     for (int i = 0; i < count; i++) { 
      String currentItem = (String) this.mList.getAdapter().getItem(i); 
      if (savedItemList.contains(currentItem)) { 
       this.mList.setItemChecked(i, true); 
      } else { 
       this.mList.setItemChecked(i, false); 
      } 
     } 
    } 
} 

私はそれはあなたのために働く願っています:

これを試してみてください!

+0

ハイデルク。あなたのお会いに感謝します。私はあなたのコードを使用しますが、私がアクティビティを再び開始すると、すべてのチェックボックスがチェックされます。どうしてか分かりません。 :s – unnamed

+0

@ fegol1985申し訳ありません!私はちょうど私の答えを修正した。試してみてください。残りのコードを見ずにこれをテストするのは難しいです。 – derrik

+0

あなたのメールを私に教えてもらえれば教えてもらえます。私は自分でそれを理解することはできません。私は知っているすべてを試みた...私の点心 – unnamed