2012-07-11 13 views
6

Estoy trabajando en una aplicación de muestra para aprender Android. Se supone que debe mostrar una lista de selección múltiple y cuando el usuario hace clic en el botón, debe mostrar los elementos seleccionados en un TextView en la parte superior. Parece que cuando trato de recuperar los elementos seleccionados de ListView, siempre se devuelve una matriz vacía. ¿Alguien puede explicarme por qué es este el caso y qué me falta para que funcione correctamente? (Para su información el código es un programa modificado de Comienzo Android 4 por Grant Allen)matriz vacía al usar getListView(). GetCheckedItemIds()

Aquí está el archivo de diseño xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <TextView 
     android:id="@+id/selection" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 
    <Button 
     android:id="@+id/getSelections" 
     android:text="Show Selections" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:onClick="listSelected" /> 
    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:drawSelectorOnTop="false" 
     android:choiceMode="multipleChoice" /> 
</LinearLayout> 

Y aquí es el Java asociado:

package com.commonsware.android.checklist; 

import android.os.Bundle; 
import android.app.ListActivity; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.view.*; 

public class ChecklistDemo extends ListActivity { 
    private static final String[] items={"lorem", "ipsum", "dolor", 
        "sit", "amet", 
        "consectetuer", "adipiscing", "elit", "morbi", "vel", 
        "ligula", "vitae", "arcu", "aliquet", "mollis", 
        "etiam", "vel", "erat", "placerat", "ante", 
        "porttitor", "sodales", "pellentesque", "augue", "purus"}; 

    private TextView selection; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     setListAdapter(new ArrayAdapter<String>(this, 
               android.R.layout.simple_list_item_multiple_choice, 
               items)); 
     selection = (TextView)findViewById(R.id.selection); 

    } 

    public void listSelected(View view) { 
     long[] chosenOnes = getListView().getCheckedItemIds(); 
     selection.setText("Items selected: "); 
     selection.setText(Integer.toString(chosenOnes.length)); 
     for (long x:chosenOnes) { 
      int i = Long.valueOf(x).intValue(); 
      selection.setText(selection.getText() + ", " + items[i]);   
     } 

    } 

} 

Respuesta

12

Véase el doc, el método getCheckedItemIds() devuelve un resultado válido solo si su adaptador tiene identificadores estables. En su lugar puede utilizar

SparseBooleanArray array = this.getListView().getCheckedItemPositions();

Hope esto le ayudará =)

+0

impresionante, Muchísimas gracias por eso. Como seguimiento, ¿puedo pedir una aclaración sobre qué es exactamente lo que hace que los identificadores sean estables? –

+0

Sí, también me gustaría saber. Supongo que significa que cada id. Siempre corresponde al mismo objeto, pero la documentación no está del todo clara. – Timmmm

+3

puede anular el método hasStableIds() en BaseAdapter por ejemplo, y dejar que sea verdadero si su getId() se implementa correctamente. – Ostkontentitan

Cuestiones relacionadas