No puede hacer clic en la fila listview con imagebutton
Tengo problemas con listview. Sus elementos (filas) tienen imagebutton. Imagebutton tiene "android: onClick" para que este evento onclick funcione, pero haga clic en la fila no funciona. Si quito imagebutton del artículo de la fila, haga clic en trabajos de la fila (el listview tiene listner correcto del onclick). Cómo puedo arreglarlo ? Necesito un evento onclick cuando el usuario haga clic en imagebutton y standart haga clic en evento, cuando el usuario seleccione la fila (no haga clic en el imagebutton pero haga clic en la fila)
Mi lista:
- Desplazamiento con varios ListViews para Android
- Cambiar el color de fondo del primer elemento en ListView
- No se puede obtener el número de fila que se ha hecho clic en la vista de lista de android
- ¿Por qué establecer setBackgroundColor no funciona en mi lista personalizada?
- QUERIDO: TableLayout-Like ListView
<ListView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/restaurants_list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:divider="@color/list_devider" android:dividerHeight="1dp" android:cacheColorHint="@color/list_background" />
- ¿Cómo mostrar archivos en la tarjeta SD en un ListView?
- Pasar una lista de una actividad a otra
- Getter no está asociado a ningún campo - Realm
- Listview no se puede hacer clic cuando se puede seleccionar la vista de texto dentro de esa vista de lista
- ¿Es posible desactivar scroll en un listView?
- ¿Cómo lleno un ListView (en Android) con datos XML o JSON?
- ¿Cómo puedo tener un ListView dentro de un NestedScrollView
- Flujo de trabajo de facturación en la aplicación en un ListView
Desafortunadamente,
android:focusable="false" android:focusableInTouchMode="false"
No funciona para ImageButton
.
Finalmente encontré la solución aquí . En su xml de diseño para esos elementos, agregue
android:descendantFocusability="blocksDescendants"
A la vista raíz.
Funciona perfectamente para un ListView
que tiene ImageButton
s. De acuerdo con la referencia oficial , blocksDescendants
significa que el ViewGroup
bloqueará a sus descendientes de recibir el foco.
Puede utilizar un adaptador personalizado para su listView (si no lo ha hecho ya). Y ahí, en el getView(int position, View inView, ViewGroup parent)
del adaptador haga algo como esto:
@Override public View getView(int position, View inView, ViewGroup parent) { View v = inView; ViewHolder viewHolder; //Use a viewholder for sufficent use of the listview if (v == null) { LayoutInflater inflater = (LayoutInflater) adaptersContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = inflater.inflate(R.layout.list_item, null); viewHolder = new ViewHolder(); viewHolder.image = (ImageView) v.findViewById(R.id.ImageView); v.setTag(viewHolder); } else { viewHolder = (ViewHolder) v.getTag(); } ..... viewHolder.image.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Click on imageView }i }); v.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //Click on listView row } }); ..... return (v); }
Vea aquí si necesita ayuda para crear su adaptador personalizado.
Si una fila de listView tiene algún elemento que se pueda hacer clic como Button
, Image
etc onItemClick
entonces onItemClick
no funcionará. Por lo tanto, necesita escribir el oyente de getView
en getView
de su adaptador de lista.
Para más lea esto .
Establezca estas propiedades para su botón:
android:focusable="false" android:focusableInTouchMode="false"
O puede configurarlo dinámicamente en su clase de adaptador:
yourButton.setFocusable(false); yourButton.setFocusableInTouchMode(false);
Y asegúrese de que establece el modo de selección como único para el listview:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
Si una fila tiene varios elementos que se pueden hacer clic, onItemClick () no funcionará. Tendrá que configurar OnClickListener
en el método getView()
. Almacene a los oyentes la etiqueta de View para que puedan ser reciclados, agregue métodos a sus oyentes para que puedan ser especializados para diferentes filas.
@Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); RowClickListeners listeners = (RowClickListeners) view.getTag(); if (listeners == null) { listeners = new RowClickListeners(); } // Row click listener: RowClickListener onClickListener = listeners.rowClickListener; if (onClickListener == null) { onClickListener = new RowClickListener(); listeners.rowClickListener = onClickListener; } onClickListener.setToPosition(pos); view.setOnClickListener(onClickListener); // Overflow listener: View btn = view.findViewById(R.id.ic_row_btn); ButtonListener btnListener = listeners.buttonClickListener; if (rowListener == null) { btnListener = new ButtonListener(activity); listeners.rowClickListener = btnListener; } btnListener.setToPosition(pos); btnListener.setCollection(collectionId); btn.setOnClickListener(btnListener); } public static class RowClickListeners { public RowClickListener rowClickListener; public ButtonListener buttonClickListener; }
En mi caso, android:descendantFocusability="blocksDescendants"
para la capa principal no funcionó, ni en el ListView. También intenté el android:focusable="false" android:focusableInTouchMode="false"
que oí que está trabajando para los botones, pero tenía ImageButton así que no.
Pero establecer las propiedades del botón en el archivo CS del diseño funcionó.
var imageButton = view.FindViewById<ImageButton>(Resource.Id.imageButton1); imageButton.Focusable = false; imageButton.FocusableInTouchMode = false; imageButton.Clickable = true;
Ninguna respuesta por encima trabajó para mí, pero una combinación lo hizo.
Ahora android:descendantFocusability="blocksDescendants"
en el ListView y android:focusable="false" android:focusableInTouchMode="false"
en los ImageButtons en el XML Y en Java también establecí descendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS)
en el ListView y focusable(false), focusableInTouchMode(false), clickable(true)
en los ImageButtons.
- Uso del archivo JSON en los recursos de la aplicación para Android
- AsyncTask: ¿dónde va el valor de retorno de doInBackground ()?