EditText in ListView wird beim Scrollen von onTextChanged aktualisiert

Ich habe nach einer Antwort gesucht, aber die Lösungen scheinen für mich nicht zu funktionieren. Ich habe ein TextView und ein EditText in einem Listenelement. Ich versuche, die gespeicherten Werte für die EditTexts zu aktualisieren, wenn der Benutzer sie bearbeitet.

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

Wenn ich das mache, löst das Scrollen den TextWatcher aus und aktualisiert die Werte, wobei der korrekte Text durch doppelten Text aus einem der anderen EditTexts überschrieben wird.

Anstelle eines TextWatchers habe ich auch diesen Code ausprobiert:

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

Außerdem werden die falschen EditTexts aktualisiert. Was vermisse ich hier?

Bearbeiten: Auch dies versucht:

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

Es behebt das Problem mit den Bildlaufänderungen, das ich gesehen habe, aber jetzt, nachdem ich einen der EditTexts bearbeitet habe, werden auch einige andere geändert.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage