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.
- Arrastrar y soltar en un `ListView`
- El desplazamiento de ListView con UniversalImageDownloader no es suave
- Iconos diferentes en la vista de lista
- Actualización de Android ListView con SimpleCursorAdapter
- El mejor método para agregar continuamente nuevos datos a listview
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 - eliminar el elemento de ListView en un clic largo
- Cómo hacer que los elementos de la lista obtengan DragEvents después de desplazarse
- Android ListView: Cómo agregar una fila con un botón
- Android ListView Seleccionar animación
- Custom ListView donde todas las imágenes tienen el mismo tamaño
- ViewPager dentro del elemento de línea ListView
- Android cursorLoader con paginación o carga más funcionalidad?
- Cambiar un divisor con setDivider en un ListActivity sin un ListView personalizado?
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?