EditText en ListView es actualizado por onTextChanged al desplazarse

He estado buscando una respuesta a esto, pero las soluciones no parecen funcionar para mí. Tengo un TextView y un EditText en un artículo de la lista. Estoy intentando actualizar los valores almacenados para los EditTexts cuando el usuario los edita.

@Override public View getView(int index, View convertView, ViewGroup parent) { ViewHolder holder = null; final int pos = index; if (convertView == null) { convertView = mInflater.inflate(R.layout.user_details_list_row, parent,false); holder = new ViewHolder(); holder.mCaptionTextView = (TextView)convertView.findViewById(id.user_detail_row_caption); holder.mDetailEditText = (EditText)convertView.findViewById(id.user_detail_row_value); convertView.setTag(holder); }else{ holder = (ViewHolder) convertView.getTag(); } holder.mDetailEditText.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { // TODO Auto-generated method stub } @Override public void afterTextChanged(Editable s) { mUserDetails.set(pos, s.toString()); } }); holder.mCaptionTextView.setText(mUserCaptions.get(index)); holder.mDetailEditText.setText(mUserDetails.get(index),BufferType.EDITABLE); return convertView; } public static class ViewHolder{ public TextView mCaptionTextView; public EditText mDetailEditText; } 

Cuando lo hago, el desplazamiento activa el TextWatcher y actualiza los valores, sobrescribiendo el texto correcto con el texto duplicado de uno de los otros EditTexts.

En lugar de TextWatcher, también he probado este código:

 holder.mDetailEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus){ EditText et = (EditText)v.findViewById(id.user_detail_row_value); mUserDetails.set(index, et.getText().toString().trim()); } } }); 

Y también actualiza los EditTexts incorrectos. ¿Que me estoy perdiendo aqui?

Edit: También probado esto:

  final ViewHolder testHolder = holder; holder.mDetailEditText.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus){ EditText et = (EditText)v.findViewById(id.user_detail_row_value); mUserDetails.set(testHolder.ref, et.getText().toString().trim()); } } }); 

Corrige el problema de cambio de desplazamiento que estaba viendo, pero ahora después de editar uno de los EditTexts, también cambia un montón de los otros.

2 Solutions collect form web for “EditText en ListView es actualizado por onTextChanged al desplazarse”

Compruebe su valor de índice si coincide con la posición de la fila en la que está trabajando. Si utiliza el patrón de titular quizás ese valor no cambiará de 0 a 7-8 dependiendo del tamaño de la pantalla. Algo así me pasó una vez, creo que lo solucioné implementando el método getCount . De esta manera, la fila 50 me dio la posición 50 y no 7 (por ejemplo).

El problema está relacionado con el hecho de que no está quitando el observador de texto agregado anteriormente del widget EditText. En su lugar, seguir añadiendo nuevos observadores a la lista. Una vez que intenta editar contenido de widget, todos los observadores de texto reciben una notificación secuencial, lo que resulta en que se actualizan los detalles de usuario erróneos.

EditText / TextView no proporciona una forma de eliminar los observadores de texto agregados anteriormente sin tener una referencia explícita a ellos. Esto significa que tendrá que volver a trabajar el código para mantener las referencias a los observadores de texto y para crear / agregar / quitar observadores para cada ejecución del método getView o para ampliar TextWatcher permitiendo la alteración de los detalles del usuario para actualizar una vez que se disparó. Esta última se implementa a continuación.

 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (convertView == null) { convertView = mInflater.inflate(R.layout.user_details_list_row, parent,false); holder = new ViewHolder(); holder.mCaptionTextView = (TextView)convertView.findViewById(id.user_detail_row_caption); holder.mWatcher = new MutableWatcher(); holder.mDetailEditText = (EditText)convertView.findViewById(id.user_detail_row_value); holder.mDetailEditText.addTextChangedListener(holder.mWatcher); convertView.setTag(holder); } else{ holder = (ViewHolder) convertView.getTag(); } holder.mCaptionTextView.setText(mUserCaptions.get(position)); holder.mWatcher.setActive(false); holder.mDetailEditText.setText(mUserDetails.get(position),BufferType.EDITABLE); holder.mWatcher.setPosition(position); holder.mWatcher.setActive(true); return convertView; } static class ViewHolder{ public TextView mCaptionTextView; public EditText mDetailEditText; public MutableWatcher mWatcher; } class MutableWatcher implements TextWatcher { private int mPosition; private boolean mActive; void setPosition(int position) { mPosition = position; } void setActive(boolean active) { mActive = active; } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { } @Override public void afterTextChanged(Editable s) { if (mActive) { mUserDetails.set(mPosition, s.toString()); } } } 

Espero que esto ayude.

  • ¿Cómo configurar el adaptador en caso de múltiples vistas de texto por lista?
  • foco perdido después de notifyDataSetChanged ()
  • Eliminar el separador ListView (en el archivo de diseño xml)
  • Menú contextual de un ListFragment
  • Desplazar el elemento ListView De derecha a izquierda mostrar el botón de borrado
  • ClassCastException no puede convertir LinearLayout $ LayoutParams a AbsListView $ LayoutParams al establecer ListView Header
  • Fuente y color del listview del cambio del androide
  • ¿Cómo saber cuándo GridView está completamente preparado y listo?
  • Uso de opengl para renderizar cada elemento en un listview en android
  • Android personalizado listview muy lento al desplazarse
  • No se puede encontrar el recurso, No se identifica el elemento que falta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.