Значения ListView EditTexts портятся при прокрутке

Как я упоминал в заголовке, просмотр списка дублирует значения edittexts для потомков после i = 10 в цикле for в моем коде.

public class ExerciseAdapter extends ArrayAdapter<ExerciseSet> {
    private ArrayList<ExerciseSet> mExercise;
    private LayoutInflater inflater;

    private List<String> texts = new ArrayList<String>();

    public ExerciseAdapter(Context context, int textViewResourceId, ArrayList<ExerciseSet> objects) {
        super(context, textViewResourceId, objects);
        mExercise = objects;
        inflater = (LayoutInflater) getContext().
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getItemViewType(int position) {
        if(mExercise.get(position).isSet() == false) return 0;
        else return 1;
    }

    @Override
    public int getViewTypeCount() {
        return 2; // two types of rows, exercise headers and bodies (sets)
    }


    public View getView(final int position, View convertView, ViewGroup parent){
        View view = convertView;
        final Holder holder;

        for(int i = 0; i < mExercise.size(); i++) {
            texts.add(String.valueOf(i));
        }

        if (getItemViewType(position) == 0) {

            if (view == null) {

                view = inflater.inflate(R.layout.item_exercise_header, null);
                holder = new Holder();


                holder.exerciseTitleView = (TextView) view.findViewById(R.id.tv_exercice_title);
                view.setTag(holder);

            } else {

                holder = (Holder) convertView.getTag();
            }
            ExerciseSet exercise = mExercise.get(position);

            if (exercise != null)
                holder.exerciseTitleView.setText(exercise.getExerciseTitle());


        } else {

            if (view == null) {
                view = inflater.inflate(R.layout.item_set, null);
                holder = new Holder();

                holder.setCounterView = (TextView) view.findViewById(R.id.tv_set_counter);

                holder.cbSet = (CheckBox) view.findViewById(R.id.cb_setdone);

                holder.repsCapt = (EditText) view.findViewById(R.id.et_reps_number);

                holder.repsCapt.setTag(position); 

                holder.repsCapt.setText(texts.get(position));

                //holder.weightCapt = (EditText) view.findViewById(R.id.et_weight_number);

                //db = new DatabaseHandler(this.getContext());

                //holder.weightCapt.setTag(position);
                view.setTag(holder);

            } else {

                holder = (Holder) convertView.getTag();

            }
            ExerciseSet exercise = mExercise.get(position);

            /*
             * edit texts
             */
            int tag_position=(Integer) holder.repsCapt.getTag();
            holder.repsCapt.setId(tag_position);

            holder.repsCapt.addTextChangedListener(new TextWatcher() {

                   @Override
                   public void onTextChanged(CharSequence s, int start, int before,
                           int count) {
                             final EditText repsText = (EditText) holder.repsCapt;

                             if(repsText.getText().toString().length()>0){
                                 texts.add(repsText.getText().toString());
                             }else{
                                 Toast.makeText(getContext(), "Please enter some value", Toast.LENGTH_SHORT).show();
                             }

                         }

                   @Override
                   public void beforeTextChanged(CharSequence s, int start, int count,
                           int after) {
                       // TODO Auto-generated method stub
                   }

                   @Override
                   public void afterTextChanged(Editable s) {

                   }

               });

            if (exercise != null) {
                holder.setCounterView.setText(String.valueOf(exercise.getSetId()));
            }


            /*
             * check boxes 
             */

            holder.cbSet.setOnCheckedChangeListener(new OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton button, boolean isChecked) {

                    if(isChecked)
                        mExercise.get(position).setCbChecked(true);
                    else
                        mExercise.get(position).setCbChecked(false);
                }
            });

            holder.cbSet.setChecked(exercise.isCbChecked());

        }

        return view;
    }

    static class Holder {
        public EditText weightCapt;
        public EditText repsCapt;

        // header row items
        TextView exerciseTitleView;

        // body row item
        CheckBox cbSet;
        TextView setCounterView;
    }

}

Я не знаю почему, пожалуйста, помогите ..

Edit_1: я попытался сохранить значения в массиве списков и извлечь их, пока представления используются повторно, но все равно дает мне дублированные значения, пока я прокручиваю вниз.

Edit_2: Если мой вопрос неясен, пожалуйста, дайте мне знать!

Edit_3: я поместил holder.repsCapt.setText (text.get (position)) внутри условия if (упражнение! = Null) {и значения больше не дублируются. Но все же, если я прокручиваю вниз и вверх, значения теряются.

Ответы на вопрос(2)

Ваш ответ на вопрос