ListView EditTexts values are messed up when scrolling

£可爱£侵袭症+ 提交于 2019-12-01 14:20:06

Your problem is surely connected with item views being reused by the list.
So check your conditions and make sure that you provide alternative text in all cases.
Let's begin with item type==0 like this:

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

add

else
    holder.exerciseTitleView.setText("debugging: nothing to show");


Edit
The same is about type==1:
- holder.repsCapt.setText(texts.get(position)) is called only on freshly inflated view
- holder.setCounterView.setText(String.valueOf(exercise.getSetId())) only when excersise is not null

Edit2
Well, for DEBUG purposes try not to reuse views in getView() - always inflate right from the start.

If everything becomes OK (or you get some empty fields) then return to my initial recommendation in this post. I suspect this scenario

If problem persists than you should pay attention to correctly getting data according to position.

I managed to solve my issue after some digging in google, here's the outcome:

@SuppressWarnings("unused")
@Override
public View getView(final int position, View convertView, ViewGroup arg2) {
    final Holder holder;
    convertView = null;
    if(getItemViewType(position) == 0) {
    if (convertView == null) {

        convertView = inflater.inflate(R.layout.item_exercise_header, null);
            holder = new Holder();
            holder.exerciseTitleView = (TextView)               convertView.findViewById(R.id.tv_exercice_title);
        convertView.setTag(holder);

        } else {

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

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

     }
     else if (getItemViewType(position) == 1) { 
     if (convertView == null) {
        holder = new Holder();

                convertView = inflater.inflate(R.layout.item_set, null);

                // reps e.t
                holder.repsCapt = (EditText) convertView
                        .findViewById(R.id.et_reps_number);

                holder.repsCapt.setTag(position);

                // weight e.t
                if(exerciseList.get(position).getExerSave()!=null) {
                    holder.repsCapt.setText(exerciseList.get(position).getExerSave().getReps());

                }
                // t.v
                holder.setCounterView = (TextView) convertView.findViewById(R.id.tv_set_counter);

                // c.b
                holder.cbSet = (CheckBox) convertView.findViewById(R.id.cb_setdone);

                convertView.setTag(holder);

            }else {
                holder = (Holder) convertView.getTag();
            }

            /*
             * text views
             */
            ExerciseSet exercise = exerciseList.get(position);

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

            /* 
             * 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 int position2 = holder.repsCapt.getId();
                   final EditText repsText = (EditText) holder.repsCapt;
                   if(repsText.getText().toString().length()>0){
                       Save sv;

                       ExerciseSet es = exerciseList.get(position2);
                       if(es.getExerSave() != null)
                           sv = es.getExerSave();
                       else sv = new Save();

                       sv.setSet(position2);
                       sv.setReps(repsText.getText().toString());

                       es.setExerSave(sv);
                       exerciseList.set(position2,es);
                   }
               }

               @Override
               public void beforeTextChanged(CharSequence s, int start, int count,
                       int after) {

               }

               @Override
               public void afterTextChanged(Editable s) {

               }
            });

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

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

            holder.cbSet.setChecked(exercise.isCbChecked());    
        }
        return convertView;
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!