programacion - manual de android en pdf
OnItemClickListener no funciona con el elemento ListView que contiene el botón (8)
Tengo ListView
con Adapter
personalizado que proporciona View
a ListView
de esta manera:
public View getView(int position, View convertView, ViewGroup parent)
{
RelativeLayout.LayoutParams lineParams;
RelativeLayout line=new RelativeLayout(context);
TextView tv=new TextView(context);
tv.setText("Text in postion="+i);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
line.addView(tv, lineParams);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
//checkbox
CheckBox checkBox=new CheckBox(context);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
line.addView(checkBox, lineParams);
return line;
}
Y en algún lugar dentro de ListView
hay setOnItemClickListener()
, que debe interceptar elementos haciendo clic en eventos. Mi problema es que, cada vez que intento agregar una casilla de verificación al elemento, no obtengo ninguna respuesta de mi ListView
. Si omito CheckBox
o cualquier otro Button
, funciona.
Estoy realmente atascado con este problema, he intentado todo tipo de diseños, alineación, envoltura, etc., inútil. Parece que CheckBox
interfiere con los eventos de clic de elementos de ListView
.
¿Alguna idea de cómo superarla?
Agregue la siguiente línea a su listaVer
android:choiceMode="singleChoice"
o asegúrese de establecer las siguientes líneas en sus campos de texto de diseño
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
Bueno, sé que ninguna de las soluciones anteriores funcionará. Intenté cambiar los atributos xml, pero eso no funciona, pero lo implementé de una manera nueva. Aquí es cómo:
Cree una interfaz CheckBoxOnCheckListener
con el método onCheckBoxChecked
y pase los parámetros necesarios, implemente la interfaz CheckBoxOnCheckListener
en su actividad o fragmento que contenga listView .
A continuación en su adaptador, declare un mListener
como CheckBoxOnCheckListener
, y páselo como un parámetro al constructor del Adaptador a partir del fragment/activity
y mListener
en CheckBoxOnCheckListener
y mListener
a mListener
.
El siguiente conjunto mListener
como itemView.onClick
o CheckBox.onCheckCheckedListener
y el método mListener.onCheckBoxChecked
llaman mListener.onCheckBoxChecked
.
Eso es. Definitivamente funcionará, funcionó para mí. Para el código solo pm.
Puede considerar escribir OnTouchEvent en su elemento listview y enviar el touchEvent apropiado a su vista secundaria, el botón.
Si está utilizando ListView
en Activity
, asegúrese de tener la configuración setOnItemClickListener()
myListView.setOnItemClickListener(this); // if your activity implement OnItemClickListener
Si tiene ImageButtons dentro del elemento de la lista, debe agregar:
android:descendantFocusability="blocksDescendants"
al elemento del elemento de la lista raíz [como el diseño raíz].
Luego, dentro de cada ImageButton en el elemento de la lista, debe agregar:
android:focusableInTouchMode="true"
Esto funcionó para mí, pero estaba usando ImageButtons, no el botón estándar.
También me he enfrentado al mismo problema que he intentado establecer android:focusable="false"
para listview pero no funciona, entonces agrego esto al elemento listview ... como en mi ítem listview, he uesed el botón Toggle que estaba creando un problema , Agrego android:focusable="false"
para alternar el botón y la vista de lista en el elemento haga clic en escuchar el inicio de nuevo trabajar
También tuve el problema de un botón en mi ListView. Desafortunadamente, configurar el foco en falso para todos los objetos en mi Adaptador no funcionó para mí.
Ahora tengo una solución.
En su adaptador, cree un OnClickListener para el botón (u otro objeto seleccionable) si aún no lo ha hecho. En ese OnClickListener usted llama al OnItemClickListener usted mismo.
public void onClick(View v) {
mOnItemClickListener.setOnItemClick(mListView, v, vPos, vId);
}
Significa que tendrá que darle acceso a su adaptador al ListView principal y al OnItemClickListener.
simplemente agregue esta línea en las vistas de elementos en lugar de listView
android:focusable="false"
compruebe más detalles sobre esto desde Android personalizado ListView incapaz de hacer clic en los elementos