Forzar un elemento ListView para permanecer "presionado" después de haber hecho clic?
Tengo un ListView que abre otra actividad cuando se hace clic en una fila de elementos a través de un oyente onItemClick.
Me gustaría que la fila de permanecer en su estado presionado desde el momento en que se hace clic en el momento de la pantalla cambia a una nueva actividad. Creo que esto sería una experiencia más clara para el usuario y verá este tipo de cosas con la mayoría de los botones que abrir / cerrar diálogos o cambiar las actividades.
- Método onClick no se llama en Android
- Android llama al método onClick sin hacer clic
- Android: Cambiar el fondo del botón en ListView Row con onClick
- Las guías de la API de Android son un poco confusas para mí sobre el atributo android: onClick XML
- Cómo configurar onclick listener para un botón en un fragmento en android
Intenté fijar view.setPressed (verdadero) en el oyente de onItemClick () pero parece ser llamado apenas un momento después de que el estado de la prensa cambió de nuevo a normal porque chasca levemente.
Por ejemplo:
mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { view.setPressed(true); //start an activity } });
Ese código casi funciona excepto para el parpadeo (el usuario presiona el elemento de la lista y se convierte en su estado presionado, entonces el usuario deja ir (completar el clic) y vuelve a su estado normal por una fracción de segundo antes de volver al estado presionado Desde la llamada setPressed (true)
¿Algunas ideas?
Gracias
Edit: Debo mencionar que estoy usando un selector xml drawable para definir los estados normales, presionados, seleccionados, etc para el fondo de la lista.
- Android: ¿Por qué el método onClick no funciona?
- Haga clic en el oyente en el botón de Android
- ¿Hay una manera de simular un clic en la pantalla en el dispositivo Android a través de código?
- La vista inflada no captura el evento onClick
- OnClick PendingIntent en widget a veces no funciona
- distinguir un golpe y hacer clic en android (pasar el evento a otra vista si es un golpe)
- Android: ¿Cómo harías que los botones no se pudieran hacer clic durante algún tiempo?
- RecyclerView onClick
Tuve el mismo problema exacto a mucha frustración!
Sin embargo, se resuelve fácilmente sustituyendo state_pressed
por state_selected
. El estado presionado seguirá cambiando rápidamente antes de onItemClick()
, pero como su tema no depende de state_pressed
el parpadeo no será visible. Una vez en onItemClick()
se establece state_selected
y el elemento permanecerá seleccionado sin que se produzca ningún parpadeo.
Aquí está mi selector:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Selected Item --> <item android:state_selected="true" android:drawable="@color/list_pressed" /> <!-- Default Item --> <item android:state_selected="false" android:drawable="@android:color/list_default" /> </selector>
Y mi onListItemClick (…):
@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); v.setSelected(true); //TODO: add further actions here }
La mejor manera de hacerlo antes de Android 3.0 es usar un estado personalizado en una vista personalizada o cambiar el color de fondo de la vista desde el adaptador. A partir de Android 3.0, puede utilizar el nuevo state_activated
para mantener un elemento de lista seleccionado.
Desde el interior de un adaptador puede hacer referencia a la vista que desea cambiar el estado. Digamos que tiene un ListView con un título y una estrella (es decir, la estrella favorita) y que desea que se mantenga "seleccionado / presionado" cuando se toca. Anule su getView y haga algo como:
@Override public View getView(int position, View convertView, ViewGroup parent) { final View view = super.getView(position, convertView, parent); final ImageButton favorite = (ImageButton) view.findViewById(R.id.favorite); favorite.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Log.d(TAG, "Star pressed..."); v.setSelected(!v.isSelected()); } }); return view; }
Y su diseño ImageButton debe hacer referencia a un dibujable como este:
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@android:drawable/star_big_on" /> <item android:state_pressed="true" android:drawable="@android:drawable/star_big_on" /> <item android:drawable="@android:drawable/star_big_off" /> </selector>
Está utilizando xml para el selector. Verifique si ha dado correctamente el estado.
Mientras establezca view.setPressed(true)
utilizará el drawable que está configurado para el estado android:state_pressed="true"
like
<item android:state_pressed="true" android:drawable="@color/gray" />
¿Ya ha intentado utilizar unscheduleDrawable en combinación con drawableStateChanged
Así que tal vez podría escuchar si el estado cambió y luego inmediatamente no programar y volver a presionar.
Tal vez ya no hay parpadeo.
En este ejemplo, el fondo se cambia después de pulsar el botón en un elemento de lista. http://androidforbeginners.blogspot.com/2010/03/clicking-buttons-in-listview-row.html
Usted puede hacer algo similar en onItemSelected () manipulando View que se ha pasado a esta llamada. Por lo general, la vista pasada es LinearLayout que contiene vistas de los niños como textView.
No utilice el selector XML. En su lugar, cambie manualmente las imágenes del elemento de lista. De esta manera usted podrá controlar la duración de una imagen en particular
- Android: detecta mediante programación si el dispositivo tiene una pantalla táctil de hardware conectada
- No se pueden obtener coordenadas de los eventos de JavaScript en dispositivos Android