2011-06-24 14 views
5

Chcę zapisać stan pola wyboru listy wyboru z wieloma opcjami. Mam następujący układ.Wiele opcji ListView i SharedPreferences

enter image description here

co chcę zrobić, to zapisać stan, na przykład, "test1 i test3" i kiedy wrócę do tej działalności to checkboxs są sprawdzane. Używam wspólnych preferencji. Mam następujący kod.

Ten ładuje moją listę:

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

a to następujące ładunki kod i zapisuje stan checkboxs (podobno).

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

Zamiast wczytać metody SaveSelections i Clear Selections w przyciskach.

Problem polega na tym, że to nie działa. Czy ktoś może mi pomóc?

Pozdrawiam.

+0

Czy próbowałeś umieścić kilka logów w swoim kodzie? Na przykład, czy settingsActivity.contains (data.toString()) zwraca true? A jaki ciąg otrzymasz za pomocą metody getString()? – Egor

+0

Witam. Problem polega na tym, że po ponownym wprowadzeniu tej czynności dodaję więcej wartości niż te, które istniały i wszystkie pola wyboru są prawdziwe. – unnamed

+0

Następnie należy zastąpić istniejące wartości, oznacza to, że należy je przechowywać pod istniejącym kluczem. – Egor

Odpowiedz

1

Ostatnio spotkałem się z podobnym problemem. Jest prawdopodobne, ponieważ przedmioty z ListView są poddawane recyklingowi (właściwości i wszystkie). Powinieneś jawnie ustawić te, które NIE zostały zapisane w stanie niezaznaczonym.

EDIT: także, choć może być nieporozumienie, nie sądzę, powinno być dodanie zapisane ciągi „dane”, ponieważ to właśnie karta jest używany do generowania listy, prawda?

Spróbuj tego:

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

Mam nadzieję, że pracuje dla Ciebie!

+0

Hi derrik. Dziękuję za uwagę. Używam twojego kodu, ale kiedy ponownie rozpocznę działanie, wszystkie pola wyboru są zaznaczone. Nie wiem dlaczego. : s – unnamed

+0

@ fegol1985 Przepraszam za to! Właśnie zmodyfikowałem swoją odpowiedź. Czy możesz spróbować? Ciężko mi to przetestować, nie widząc reszty kodu. – derrik

+0

Mogę wysłać ci moją klasę, jeśli dasz mi swój e-mail. Nie mogę sam tego zrozumieć. Próbowałem wszystkiego, co wiem ... pozdrawiam – unnamed