2011-06-24 11 views
5

Quiero guardar el estado de una casilla de verificación de lista de selección múltiple. Tengo el siguiente diseño.Opción múltiple ListView y SharedPreferences

enter image description here

Lo que quiero hacer es guardar el estado de, por ejemplo, "test1 y test3" y cuando vuelva a esta actividad esta checkboxs se comprueban. Estoy usando preferencias compartidas. tengo el siguiente código.

Esto carga mi lista:

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

y este es el código siguiente carga y guarda el estado de los checkboxs (supuestamente).

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

Debo cargar los métodos SaveSelections y Clear Selections en los botones.

El problema es que esto no funciona. alguien puede ayudarme por favor?

Mis saludos.

+0

¿Intentó poner algunos registros en su código? Por ejemplo, does settingsActivity.contains (data.toString()) devuelve true? ¿Y qué cadena obtiene a través del método getString()? – Egor

+0

Hola. El problema es que cuando ingreso de nuevo en esta actividad, agrego más valores que los que existían y establece que todas las casillas sean verdaderas. – unnamed

+0

Luego debe sobrescribir los valores existentes, lo que significa que debe almacenarlos bajo la clave existente. – Egor

Respuesta

1

Me encontré con un problema similar recientemente. Es probable porque los elementos en el ListView están siendo reciclados (propiedades y todo). Debe establecer explícitamente los que NO fueron guardados en el estado no verificado.

EDIT: Además, aunque pueda ser malentendido, yo no creo que se debe agregar sus cadenas guardadas a "datos" porque eso es lo que el adaptador está utilizando para generar su lista, ¿no es así?

Prueba esto:

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

espero que funcione para usted!

+0

Hola derrik. Gracias por tu atención. Uso su código pero cuando comienzo la actividad nuevamente, todas las casillas de verificación están marcadas. No sé por qué. : s – unnamed

+0

@ fegol1985 ¡Perdón por eso! Acabo de modificar mi respuesta. ¿Podría intentarlo? Es difícil para mí probar esto sin ver el resto de tu código. – derrik

+0

puedo enviarle mi clase si me da su correo electrónico. No puedo resolverlo por mi cuenta. Intenté todo lo que sé ... mis saludos – unnamed

Cuestiones relacionadas