2009-09-01 65 views

Respuesta

19

No puede "seleccionar" varios elementos en un ListView. Puede usar CHOICE_MODE_MULTIPLE y marcar elementos múltiples en un ListView.

+2

es un gran y también la respuesta punto. Sin embargo, el problema que veo es que los documentos de la API, y la configuración CHOICE_MODE_MULTIPE, son tan engañosos y vagos que hacen pensar que tal cosa es seguramente posible. Lo hice durante unas 6 horas de golpes de cabeza hasta que leí esto. Además, al resaltar manualmente las filas de la vista de lista, se encontrará con los efectos secundarios del reciclaje. ¿Cómo es que las vistas de la lista comprobada son inmunes a esto? –

38

En realidad se puede;) Es solo una cuestión de experiencia del usuario, ¿no?

Prueba de esto, (1) para el control de lista establece

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
listView.setItemsCanFocus(false); 

(2) definir elemento de la lista como

<CheckedTextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:gravity="center_vertical" 
    android:paddingLeft="6dip" 
    android:paddingRight="6dip" 
    android:checkMark="?android:attr/listChoiceIndicatorMultiple" 
    android:background="@drawable/txt_view_bg" /> 

Este es el mismo que android.R.layout.simple_list_item_multiple_choice excepto android:background="@drawable/txt_view_bg

(3) Y defina drawable txt_view_bg.xml como

<item android:drawable="@drawable/selected" 
    android:state_checked="true" /> 
<item android:drawable="@drawable/not_selected" /> 

Nota: - La mejor forma de manejar opción múltiple es rastrear las opciones de su auto-con el elemento clic clic, en lugar de en función de su estado en la lista.

+1

I suponer que los elementos del artículo arriba están en un elemento selector, y que "seleccionado" y "not_selected" son dibujables suministrados por el usuario (como una imagen). ¿Hay alguna manera de usar las casillas de verificación de la plataforma? – Diederik

+1

Para usar las casillas de verificación de la plataforma, elimine el atributo de fondo y omita el punto (3). Aunque los cuadros aparecen para mí, lamentablemente no puedo verificar la casilla. Solo puedo hacerlo a través del xml usando el atributo android: checked para establecer un valor predeterminado, pero no puedo cambiarlo en tiempo de ejecución al tocarlo. – faizal

0

y para conseguirlo:

public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

       Log.d(getLocalClassName(), "onItemClick(" + view + "," 
         + position + "," + id + ")"); 
     } 
    }); 
12

Paso 1: setAdapter a su vista de lista.

listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice, GENRES)); 

Paso 2: modo de elección conjunto para listview .La segunda línea de debajo de código representa que casilla de verificación debe ser revisado.

listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
listView.setItemChecked(2, true); 

listView.setOnItemClickListener(this); 



private static String[] GENRES = new String[] { 
     "Action", "Adventure", "Animation", "Children", "Comedy", "Documentary", "Drama", 
     "Foreign", "History", "Independent", "Romance", "Sci-Fi", "Television", "Thriller" 
    }; 

Paso 3: vistas marcados se devuelven en SparseBooleanArray, por lo que podría utilizar el siguiente código para obtener la clave o values.The a continuación muestra simplemente muestran los nombres seleccionados en una sola cadena.

@Override 
    public void onItemClick(AdapterView<?> adapter, View arg1, int arg2, long arg3) 
    { 

    SparseBooleanArray sp=getListView().getCheckedItemPositions(); 

    String str=""; 
    for(int i=0;i<sp.size();i++) 
    { 
     str+=GENRES[sp.keyAt(i)]+","; 
    } 
    Toast.makeText(this, ""+str, Toast.LENGTH_SHORT).show(); 

    } 
+3

si deselecciona un artículo, continuará apareciendo en el brindis. Entonces ... si selecciona 3 elementos, luego los deselecciona y elige 1 otro elemento, la cadena contendrá los 4 elementos, incluso solo 1 elemento seleccionado. No puedo explicar por qué, porque siempre tenemos un nuevo String = "". ¿El 'getCheckedItemPositions()' almacena todos los valores que se han seleccionado? pero sería extraño. Sería bueno resolver esto, lo he intentado, pero hasta saber que no podría resolverlo. Por lo tanto, si alguien sabe, comparta la solución. – AlexAndro

0

Tienes que seleccionar la opción de ArrayAdapter:

ArrayAdapter<String> adapter = new ArrayAdapter<String> 
    (this, android.R.layout.simple_list_item_single_choice, countries); 
2

para "actualizar" el mensaje de pan tostado después desactivando algunos elementos, sólo hay que poner esta línea dentro del bucle:

if (sp.valueAt(i)) 

por lo que los resultados:

for(int i=0;i<sp.size();i++) 
{ 
    if (sp.valueAt(i)) 
     str+=names[sp.keyAt(i)]+","; 
} 
0

La mejor manera es tener una barra de acción contextual con vista de lista de selección múltiple, se puede hacer vista de lista como multiselect usando el siguiente código

listview.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE_MODAL); 

Y ahora establecido oyente multichoice para Listview, Se puede ver la aplicación completa de vista de lista de selección múltiple en Android multi select listview

0

es muy simple,

listViewRequests.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
        **AppCompatCheckedTextView checkBox = (AppCompatCheckedTextView) view;** 
        Log.i("CHECK",checkBox.isChecked()+""+checkBox.getText().toString());** 

       } 
      }); 
Cuestiones relacionadas