EditText in ListView viene aggiornato da onTextChanged quando si scorre

Ho cercato una risposta a questo, ma le soluzioni non sembrano funzionare per me. Ho un TextView e un EditText in un elemento di elenco. Sto cercando di aggiornare i valori memorizzati per gli EditTexts quando l'utente li modifica.

@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; } 

Quando lo faccio, lo scorrimento triggers il TextWatcher e aggiorna i valori, sovrascrivendo il text corretto con il text duplicato da uno degli altri EditTexts.

  • Come get uno background di Button per default (in modo programmato)?
  • Database multipli in una singola applicazione in Android
  • Movimento di due bitmap contemporaneamente in una vista con MotionEvent
  • Imansible risolvere tutte le dependencies per la configuration ': classpath'
  • Come modificare al livello di programmazione il motore predefinito TTS
  • Come bufferare il pdf che sta scaricandolo e visualizzarlo durante lo scaricamento utilizzando l'applicazione Pdf reader in android
  • Invece di un TextWatcher, ho anche provato questo codice:

     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()); } } }); 

    Inoltre aggiorna gli EditTexts sbagliati. Cosa mi manca qui?

    Modifica: Prova anche questo:

      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()); } } }); 

    Corregge il problema di scorrimento che stavo vedendo, ma ora dopo aver modificato uno degli EditTexts, cambia anche un gruppo di altri.

  • Effettuare acquisti in-app con un account di gioco Google diverso dall'account principale del dispositivo
  • È ansible tagliare una bitmap a piccoli pezzi senza caricare l'intera cosa in memory?
  • NoClassDefFoundError sotto SDK 21
  • Crea un anteprima del prodotto interattivo a 360 gradi
  • Android MediaRecorder getMaxAmplitude restituisce sempre 0 su LG Optimus
  • Elenca tutti i file da tutta la cartella in un singolo elenco
  • 2 Solutions collect form web for “EditText in ListView viene aggiornato da onTextChanged quando si scorre”

    Controllare il valore dell'indice se corrisponde alla posizione di row su cui si sta lavorando. Se si utilizza il model di supporto, forse il valore non cambia da 0 a 7-8 a seconda della dimensione dello schermo. Qualcosa di simile mi è successo una volta, penso di averlo risolto attuando il metodo getCount . In questo modo la row 50 mi ha dato la posizione 50 e non 7 (per esempio).

    Il problema è relativo al fatto che non si sta rimuovendo il watcher di text precedentemente aggiunto dal widget EditText. Al contrario, continui a aggiungere nuovi osservatori all'elenco. Una volta che si tenta di modificare il contenuto di widget, tutti gli osservatori di text vengono notificati in sequenza, causando che i dettagli utente errati vengono aggiornati.

    EditText / TextView non fornisce un modo per rimuovere i watchers di text precedentemente aggiunti senza avere un riferimento esplicito a loro. Ciò significa che dovrai ricamare il codice per mantenere i riferimenti agli osservatori di text e per creare / aggiungere / rimuovere gli osservatori per each esecuzione del metodo getView o estendere TextWatcher, consentendo di modificare i dettagli utente per aggiornarlo una volta che viene licenziato. Quest'ultimo è attuato sotto.

     @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()); } } } 

    Spero che questo ti aiuti.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.