para - manual de programacion android pdf
OnItemCLickListener no funciona en listview (19)
Añadir esto en el diseño principal
android:descendantFocusability="blocksDescendants"
Escriba este código en cada botón, Textview, ImageView, etc. que tenga onClick
android:focusable="false" android:clickable="false"
Espero que funcione.
Código de clase de Activity
:
conversationList = (ListView)findViewById(android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});
La función getView
en la clase Adapter
:
if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}
¿Hay algún problema con el uso de dos xmls al inflar?
Acabo de encontrar una solución desde aquí ... pero haciendo clic en ...
Si algún elemento de la lista de la fila contiene una vista OnItemClickListener
o en la que se OnItemClickListener
hacer clic, OnItemClickListener
no funcionará.
El elemento de la fila debe tener un parámetro como android:descendantFocusability="blocksDescendants"
.
Aquí puede ver un ejemplo, cómo debe verse el elemento de su lista. El elemento de tu lista xml debe ser ... row_item.xml (your_xml_file.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:descendantFocusability="blocksDescendants"
android:gravity="center_vertical" >
// your other widgets here
</LinearLayout>
Android: el atributo de texto automático también hace que TextView se pueda enfocar automáticamente.
Ante el mismo problema, lo intentaron durante horas. Si ha intentado todo lo anterior, intente cambiar layout_width de Listview y list item para match_parent desde wrap_content.
Dos soluciones asombrosas fueron las siguientes: si no se llama a Lististage desde un fragmento, sepa que mListView.setOnItemClickListener
no se llamará antes de crear su actividad, esto aseguró que se establezca cuando se haya creado la actividad.
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
// Do the onItemClick action
Log.d("ROWSELECT", "" + rowId);
}
});
}
Mientras miraba el código fuente de ListFragment, encontré esto
public class ListFragment extends Fragment {
...........................................
................................................
final private AdapterView.OnItemClickListener mOnClickListener
= new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
onListItemClick((ListView)parent, v, position, id);
}
};
................................................................
................................................................
public void onListItemClick(ListView l, View v, int position, long id) {
}
}
Se onItemClickListener
objeto onItemClickListener
y llama a onListItemClick()
Como tal, la otra solución similar, que funciona de la misma manera es anular onListItemClick()
@Override
public void onListItemClick(ListView l, View v, int position, long rowId) {
super.onListItemClick(l, v, position, id);
// Do the onItemClick action
Log.d("ROWSELECT", "" + rowId);
}
El problema es que sus diseños contienen elementos enfocables o seleccionables. Si una vista contiene un elemento enfocable o en el que se puede hacer clic, no se llamará a OnItemCLickListener.
Haga clic here para más información.
Por favor, publique uno de sus xmls de diseño si ese no es el caso.
He intentado todo lo anterior y nada funcionó.
Resolví el problema de la siguiente manera:
Primero defino un botón personalizado llamado ListButton
public class ListButton extends android.widget.Button
{
private ButtonClickedListener clickListener;
public ListButton(Context context)
{
this(context, null);
}
public ListButton(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public ListButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void setClickListener(ButtonClickedListener listener) {
this.clickListener = listener;
}
@Override
public boolean isInTouchMode() {
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
eventClicked();
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_MOVE:
break;
default :
}
return true;
}
private void eventClicked() {
if (this.clickListener!=null) {
this.clickListener.ButtonClicked();
}
}
}
El XML se ve como:
<dk.example.views.ListButton
android:id="@+id/cancel_button"
android:layout_width="125dp"
android:layout_height="80dp"
android:text="Cancel"
android:textSize="20sp"
android:layout_margin="10dp"
android:padding="2dp"
android:background="#000000"
android:textColor="#ffffff"
android:textStyle="bold"
/>
Luego defino mi propia interfaz de ButtonClicked
Listener:
public interface ButtonClickedListener {
public void ButtonClicked();
}
Luego uso mi propio oyente como si fuera el OnClickListener
normal:
final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);
cancelButton.setClickListener(new ButtonClickedListener() {
@Override
public void ButtonClicked() {
//Do your own stuff here...
}
});
Incluso tuve el mismo problema, tengo una casilla de verificación, hice lo siguiente para el trabajo del enmascarador itemClickListener,
Agregó las siguientes propiedades a la casilla de verificación,
android:focusable="false"
android:focusableInTouchMode="false"
android:clickable="false"
y ItemClickListner comenzó a trabajar.
Para un ejemplo detallado puede ir a través del enlace,
http://knowledge-cess.com/android-itemclicklistner-with-checkbox-or-radiobutton/
Espero que ayude a Cheers !!
Lo resolví con la ayuda de esta respuesta.
1.Agregue lo siguiente en Diseño lineal de list_items.xml android:descendantFocusability="blocksDescendants"
2. Vistas de niños de LinearLayout en list_items.xml
android:focusable="false"
Para mis listas, mis filas tienen otras cosas en las que se puede hacer clic, como los botones, por lo que hacer una manta de bloques Los detendientes no funciona. En su lugar, agrego una línea en el xml del botón:
android:focusable="false"
Eso evita que los botones bloqueen los clics en las filas, pero aún así permite que los botones también tomen los clics.
Si desea utilizar tanto el clic simple como el clic prolongado en los elementos de la vista de lista, sería mejor utilizar el menú contextual para un clic prolongado. Evite usar setItemLongClickListener especialmente si tiene varios diseños de fila para su vista de lista.
Todo lo anterior falló para mí. Sin embargo, pude resolver el problema (después de muchas horas de golpearme la cabeza: Google, si está escuchando, por favor considere corregir lo que encontré a continuación en forma de errores del compilador, si es posible)
Debes tener cuidado con los atributos de Android que agregas a tu diseño xml aquí (en esta pregunta original, se llama list_items.xml). Para mí, lo que estaba causando el problema era que había cambiado de una vista de Editar Texto a una Vista de Texto y tenía atributos de sobra del cambio (en mi caso, inputType). El compilador no lo detectó y la capacidad de hacer clic simplemente falló cuando fui a ejecutar la aplicación. Comprueba dos veces todos los atributos que tienes en tus nodos de diseño xml.
Tuve el mismo problema y acabo de ver que accidentalmente puse:
@Override
public boolean isEnabled(int position)
{
return false;
}
en mi clase CustomListViewAdapter.
Al cambiar esto a:
return true;
He logrado solucionar el problema. Por si acaso si alguien ha cometido el mismo error ...
Tuve el mismo problema y probé todas las soluciones mencionadas en vano. a través de las pruebas descubrí que hacer que el texto fuera seleccionable impedía que se llamara al oyente. Así que cambiando a falso, o eliminándolo, llamaron nuevamente a mi oyente.
android:textIsSelectable="false"
Espero que esto ayude a alguien que estaba atrapado como yo.
Usa android: descendantFocusability
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="80dip"
android:background="@color/light_green"
android:descendantFocusability="blocksDescendants" >
Añadir arriba en el diseño de la raíz
en mi caso, ninguna de las propiedades de diseño xml no fue útil.
Solo agrego una línea de código como esta: convertView.setClickable (false);
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null || convertView.getTag() == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
...
convertView.setClickable(false);
return convertView;
}
básicamente, hace lo mismo que configurar las propiedades en el diseño xml, pero fue lo único que funcionó en mi caso.
No es el momento perfecto, pero tal vez ayude a alguien. Feliz codificación.
si tiene vistas de texto, botones o stg pulsable o seleccionable solo en la vista de fila
android:descendantFocusability="blocksDescendants"
no es suficiente. Tienes que configurar
android:textIsSelectable="false"
a sus vistas de texto y
android:focusable="false"
a sus botones y otros elementos enfocados.
use el código a continuación dentro de la etiqueta del botón en el diseño de fila personalizado de listview
android:focusable="false"
android:clickable="false"
necesitas hacer 2 pasos en tu listview_item.xml
- establece el diseño de la raíz con:
android:descendantFocusability="blocksDescendants"
- establezca cualquier vista enfocable o seleccionable en este elemento con:
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
Aquí hay un ejemplo: listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:layout_marginTop="10dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:gravity="center_vertical"
android:orientation="vertical"
android:descendantFocusability="blocksDescendants">
<RadioButton
android:id="@+id/script_name_radio_btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textStyle="bold"
android:textColor="#000"
android:padding="5dp"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
/>
</LinearLayout>