2012-10-12 124 views
6

En mi aplicación, tengo un panel izquierdo que contiene una vista de lista. La selección realizada en esta vista de lista, luego solicita los datos relevantes, que actualiza el panel derecho y otros enlaces y elementos en la actividad. Debido a este diseño, el panel izquierdo siempre debe tener una selección hecha para dar al resto de la actividad valores útiles.Android: configuración de un elemento de vista de lista cliqueado programáticamente en el estado seleccionado

En el método onCreate de mi actividad llamo a lo siguiente para seleccionar el primer elemento de la lista de manera predeterminada. (ProgramList es mi vista de lista)

programList.performItemClick(programList, 0, programList.getItemIdAtPosition(0); 

que todas las obras grandes y la vista de las cargas como se esperaba con los valores correctos, excepto por una cosa.

He agregado un selector dibujable para la vista de lista que resalta el elemento seleccionado. Cuando se haga clic físicamente en el emulador, se resaltará (estoy usando CHOICE_MODE_SINGLE), pero no se resaltará al llamar a performItemClick(). He buscado ayuda en stackoverflow y he tratado de usar lo siguiente antes del clic, pero no hizo la diferencia.

programList.requestFocusFromTouch(); 
    programList.setSelection(0); 

De la lectura de la API que suena como el método setSelection no establece el estado del elemento bajo una interfaz táctil, y de mis resultados, parece que el método performItemClick tampoco. También probé a usar

programList.getAdapter().getView(0, null, null).setSelected(true); 

Entonces puedo leer el estado de la vista de texto y ver que está seleccionado, pero que también hizo nada para cambiar lo que se visualiza en la pantalla.

¿Hay algo en el método onCreate que impida que el estado del botón se dibuje de manera diferente? Traté de invalidar el dibujo dentro de la vista de texto individual e invalidar la vista de texto en sí, pero eso no ayudó. También intenté cambiar el fondo de la vista de texto, pero parece que el selector que he establecido gobierna eso o se dibuja al frente. Sé que tengo el textView correcto porque he usado getText para leer lo que hay adentro.

Si alguien puede ayudarme con este problema o me indica una solución, sería muy apreciado.

Respuesta

4

El truco es anular el método getView() del adaptador. Prueba esto:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final View renderer = super.getView(position, convertView, parent); 
    if (position == index_of_selected_item) { 
     renderer.setBackgroundResource(android.R.color.darker_gray); 
    } 
    return renderer; 
} 

Por supuesto, se puede establecer el color de fondo a cualquier color que usted tiene gusto para indicar que él es el artículo "activa".

+0

Gracias. ¿Hay alguna manera de hacer que esto funcione mediante el uso del método listview.setSelector(), o tendré que establecer el resto de mis estados usando getView()? El setSelector es mucho más conveniente ya que es solo un recurso xml. Desearía saber qué sucede de forma diferente cuando hago clic con el mouse en el emulador y lo que sucede cuando llamo programáticamente al evento click. – ndw

+0

Esto no me permite anular la selección del artículo, incluso si agrego más a su estado de cuenta y configuro el otro color. La vista Obtener solo se invoca inicialmente cuando se carga la vista. Una vez que se establece el fondo para ese elemento de vista de lista, se mantendrá de esa manera. [esto] (http://stackoverflow.com/questions/10296846/listing-list-android-list-first- after-loading-datas) me ha acercado más, pero su explicación es incompleta. – ndw

+2

¿Cómo puedo obtener el valor index_of_selected_item? – Dimitri

Cuestiones relacionadas