2010-08-12 16 views
10

Editar: Bien, encontré una solución. No sé si es la solución adecuada, pero funciona correctamente. Agregado al código a continuación.Devolver valores de selección múltiple ListView

Estoy tratando de permitir que un usuario seleccione una cantidad de directorios de una lista de verificación y los devuelva al hacer clic en el botón "Enviar". Aquí hay un fragmento de mi código. Completa el ListView con todos los directorios en/sdcard /, y para la selección inicial (de cualquiera que elija) cuando envío, el registro muestra las opciones correctas devueltas. Sin embargo, si desactivo un elemento y vuelvo a hacer clic en "Enviar", todavía se muestra como si todos estuvieran seleccionados. ¿Debo escribir un controlador para desmarcar un artículo? Pensé que eso fue solucionado por la selección choiceMode? ¡Gracias!

private SparseBooleanArray a;  
directoryList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, directoryArray)); 
    submitButton = (Button)findViewById(R.id.submit_button); 
    submitButton.setOnClickListener(new OnClickListener() 
     { 
     @Override 
     public void onClick(View v) 
     { 
      a = new SparseBooleanArray(); 
      a.clear(); 
      a = directoryList.getCheckedItemPositions(); 

      for (int i = 0; i < a.size(); i++) 
      { 
       //added if statement to check for true. The SparseBooleanArray 
       //seems to maintain the keys for the checked items, but it sets 
       //the value to false. Adding a boolean check returns the correct result.      
       if(a.valueAt(i) == true) 
        Log.v("Returned ", directoryArray[a.keyAt(i)]); 

      }     
     } 
    }); 

Respuesta

3

Hice un poco más de depuración y encontré una solución que funcionó para mí. Editado en el código de arriba. Por alguna razón, SparseBooleanArray no se vacía solo; mantiene las claves de los cuadros que se han verificado. Sin embargo, cuando se llama a getCheckedItemPositions(), establece el valor en falso. Entonces, la clave aún está en la matriz devuelta, pero tiene un valor de falso. Solo los recuadros marcados se marcarán con un valor de verdadero.

1

no fue mi intención hacer esto como una respuesta, pero tuve que expandir lo que usted hizo para hacer una selección múltiple. ¿Por qué hiciste una variable de campo para tus selecciones? Acabo de hacer SparseBooleanArray locales ...

public class NaughtyAndNice extends ListActivity { 
TextView selection; 
String[] items={"lorem","ipsum", "dolor", "sit", "amet", 
     "consectetuer", "adipisc", "jklfe", "morbi", "vel", 
     "ligula", "vitae", "carcu", "aliequet"}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,items)); 
      selection = (TextView)findViewById(R.id.selection); 
    this.getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
} 

public void onListItemClick(ListView parent, View view, int position, long id){ 
    SparseBooleanArray choices = parent.getCheckedItemPositions(); 
    StringBuilder choicesString = new StringBuilder(); 
    for (int i = 0; i < choices.size(); i++) 
    { 
    //added if statement to check for true. The SparseBooleanArray 
    //seems to maintain the keys for the checked items, but it sets 
    //the value to false. Adding a boolean check returns the correct result.      
     if(choices.valueAt(i) == true) 
      choicesString.append(items[choices.keyAt(i)]).append(" "); 

    } 
    selection.setText(choicesString); 
} 
} 

+0

Parece terriblemente ineficiente hacer el ciclo for y luego dentro del ciclo for for hacer una tecla En ... qué tan malo funciona keyAt? oh bien – JDPeckham

+0

No entiendo la diferencia en este código ... parece ser funcionalmente idéntico al mío. – kcoppock

+0

Oh, no sé por qué, eché de menos tu pregunta. No había una razón real para hacer una variable de clase para la SBA, solo era nuevo para Java y Android y lo hice estúpidamente. :) – kcoppock

4

Sé que has encontrado una solución que funcione para usted, pero el más limpio y solución más simple que trabajará probablemente la mayor parte del el tiempo es esto (quiero persistir todos los identificadores de los elementos seleccionados):

(en mi lista de actividades):

SparseBooleanArray selectedPos = getListView() 
     .getCheckedItemPositions(); 

ListAdapter lAdapter = getListAdapter(); 
List<Long> ids = new LinkedList<Long>(); 
    for (int i = 0; i < lAdapter.getCount(); i++) { 
    if (selectedPos.get(i)) { 
     ids.add(lAdapter.getItemId(i)); 
    } 
} 
1

No hay necesidad de utilizar SparseBooleanArray choices = parent.getCheckedItemPositions();

StringBuilder es suficiente para esto.

Cuestiones relacionadas