EditText de Focusable en ListView y onItemClick
En cada elemento ListView
tengo EditText
.
Cuando establezco android:focusable="false"
para EditText
entonces onItemClick
en el elemento ListView
está trabajando, pero EditText
no obtiene el cursor cuando hago click
interior.
- Cómo obtener la altura de la lista en android?
- Comprensión de Android ListView
- Implementar una lista con divisor de sección en android
- ¿Cómo conseguir el foco del niño de ListView?
- ¿Cómo puedo mostrar contenido CSV específico en el elemento de la lista que se ha hecho clic?
Si voy a configurar android:focusable="true"
para EditText
, entonces EditText
es EditText
, pero onItemClick
para el ListView
no funciona cuando hago clic en él.
Cómo separar onItemClick
y EditText
en este elemento?
- Android - ¿Cómo implementar un NavigationDrawer parcialmente visible en todo momento?
- Cómo cambiar el nombre del nombre de Listview Después de enviar una solicitud de servidor dentro de una clase de adaptador personalizado?
- Obtener clic en el elemento de listview
- Actualizar fragmento actual (datos ListView) que permanece en la misma actividad
- MotionEvent.ACTION_UP no se llama
- Una fila a fill_parent ListView height
- ListView o TableLayout?
- ListView filtrar correctamente pero muestra un resultado incorrecto
Gracias @ user370305 por la idea con OnTouchListener. Ahora funciona para mí usando setOnTouchListener()
:
public class AdapterListCards extends CursorAdapter implements View.OnTouchListener { public AdapterListCards(Context context) { super(context, null, true); } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (view instanceof EditText) { EditText editText = (EditText) view; editText.setFocusable(true); editText.setFocusableInTouchMode(true); } else { ViewHolder holder = (ViewHolder) view.getTag(); holder.edtCode.setFocusable(false); holder.edtCode.setFocusableInTouchMode(false); } return false; } private class ViewHolder { TextView txtName; EditText edtCode; } @Override public View newView(final Context context, Cursor cursor, ViewGroup parent) { View convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); final ViewHolder holder = new ViewHolder(); holder.txtName = (TextView) convertView.findViewById(R.id.txt_name); holder.edtCode = (EditText) convertView.findViewById(R.id.pass); holder.edtCode.setOnTouchListener(this); convertView.setOnTouchListener(this); convertView.setTag(holder); return convertView; } @Override public void bindView(View view, Context context, Cursor cur) { ViewHolder holder = (ViewHolder) view.getTag(); if (cur!=null) holder.txtName.setText(cur.getString(cur.getColumnIndex("name"))); } }
Y por supuesto: android:windowSoftInputMode="adjustPan"
para la actividad en el manifiesto.
Mi solución:
@Override public boolean onTouch(View view, MotionEvent motionEvent) { ViewHolder vh = (ViewHolder) view.getTag(); //vh.row is the convertView in getView or you may call it the row item itself ((ViewGroup)vh.row).setDescendantFocusability(view instanceof EditText?ViewGroup.FOCUS_AFTER_DESCENDANTS:ViewGroup.FOCUS_BLOCK_DESCENDANTS); return false; }
Y añada
android:descendantFocusability="blocksDescendants"
Al grupo de vistas en el archivo xml de diseño para el elemento de fila de lista.
La solución que funcionó para mí fue usar el EditText con TextView y un indicador en adater indicando el modo de edición habilitado / deshabilitado.
Añadí el TextView y el EditText en la misma posición en un diseño relativo, lo que significa que se superponen unos a otros. El EditText se ocultará por defecto y TextView se mostrará. En esto el clic del artículo de listview trabaja perfectamente.
Entonces asigné el oyente de tacto para TextView y onTouch ocultar el textview y exhibir el EditText y requestfocus que permite la entrada. Incluso el punto de vista entero en el clic solicitará el enfoque para EditText. Por lo tanto, no se habilitará ningún clic de artículo.
Tengo un botón en la barra de acción "Hecho". Una vez que haga clic en él actualizar mi bandera en el adaptador diciendo "modeEdit = false" y llamar a notificydatasetchanges.
En GetView tenemos comprobar la bandera y si modeEdit = false, entonces mostrar TextView.
Esto fue sólo la mejor solución que tengo que estar trabajando!
Espero que esto ayude. Déjeme saber si alguien está interesado en la copia de trabajo del código fuente.
- Android google signin y facebook inicio de sesión botón de mirar completamente diferente
- ¿Cómo desactivo proguard para crear mi aplicación de Android?