Individual ListView scrolling randomly changes button text or edittext

I searched for this, but to no avail. I did not get an exact answer to the question.

I have a button inside ListView, when this button is pressed, it shows a warning dialog to select a date and after selecting a date, the selected date will be a text button. The code works fine, but when I scroll down and up, the date will randomly change here is my code for the method of getView()my adapter. This also happens with EditTextwhen I click any of EditTextworks fine, but when I start scrolling, the values ​​also change.

Here is my view method

public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);

        viewHolder = new ViewHolder();
        viewHolder.btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
        viewHolder.txtNotes  = (EditText) convertView.findViewById(R.id.rpNotes);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder) convertView.getTag();
    }


    RepeatEntryList repeatEntryList = listData.get(position);
    viewHolder.btnDate.setText(repeatEntryList.getDate());
    viewHolder.btnDate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          //EVEN IF I REMOVE THE CODE FOR SETTING THE BUTTON TEXT TO JUST LIKE THE BELOW CODE. SCROLLING ISSUES STILL PERSIST

          viewHolder.btnDate.setText("just sample date text");

            //**NOTE UPDATED**
            //MY EDITTEXT ALSO HAVE THE SAME BEHAVIOR
        }
    });
    viewHolder.txtNotes.setHint(contx.getResources().getString(R.string.placeholder_txt));
    return convertView;
}

. , 20 20 EditText ListView. - EditText , , ListView, EditText , .

, - , ListView .

+4
5

, , - , - :
 1. Adapter, RepeatEntryListAdapter listData​​p >

public ArrayList<RepeatEntryList> listData;

2. listData RepeatEntryList, getter setter, .

public RepeatEntryListAdapter(Context context,ArrayList<RepeatEntryList> listdata){
          this.listData = listdata;
            this.contx = context;
            mainActivity = (MainActivity) context;
            layoutInflater= LayoutInflater.from(context);
       }

3. getview click . click getter, getter settext, , lisData​​strong > . listData​​strong > , , listData​​strong > varaible like .

 RepeatEntryList re = rListData;
 viewHolder.btnDate.setText('07-06-2015')//say the date selected is the string inside setText                          re.setDate(viewHolder.btnDate.getText().toString());//set Date is a setter method inside my RepeatEntryList class
 listData.set(position, re);//position variable should be final

4. , , edittext, . .

. , TextWatcher

class EditTextWatcher 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){
                //rNotes.set(mPosition,s.toString());
                RepeatEntryList re = listData.get(mPosition);
                re.setNotes(s.toString());
                listData.set(mPosition,re);
            }
        }
    }

. EditeTextWatcher ViewHolder

 static class ViewHolder{
   public Button btnDate;
   public EditText txtNotes;
   public EditTextWatcher mWatcher;
}

. getview EditTextWatcher(), textwatcher , textwatcher

public View getView(final int position, View convertView, ViewGroup parent) {

        final ViewHolder viewHolder;

        final RepeatEntryList rListData = listData.get(position);

        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);

            viewHolder = new ViewHolder();
            viewHolder.btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
            viewHolder.mWatcher = new EditTextWatcher();
            viewHolder.txtNotes  = (EditText) convertView.findViewById(R.id.rpNotes);
            viewHolder.txtNotes.addTextChangedListener(viewHolder.mWatcher);

            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) convertView.getTag();


        }

        viewHolder.btnDate.setText(rListData.getDate());

        viewHolder.mWatcher.setActive(false);
        viewHolder.txtNotes.setText(rListData.getNotes());
        viewHolder.mWatcher.setPosition(position);
        viewHolder.mWatcher.setActive(true);


      //here is the part of button click event i mention above (no 3.)
return convertView;
}
+1

, if (convertView == null) {} else {} ,

convertView = layoutInflater.inflate(R.layout.repeat_entry_listview,null);
Button btnDate = (Button) convertView.findViewById(R.id.rpbtnDate);
TextView txtNotes  = (EditText) convertView.findViewById(R.id.rpNotes);
+7

position final getView

final int position

.

final RepeatEntryList repeatEntryList = listData.get(position);
+3

, repeatEntryList.setDate( " " )

datePickerTo.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                                String strdate = (pickerTo.getMonth() + 1) + "-" + pickerTo.getDayOfMonth() + "-" + pickerTo.getYear();

                                viewHolder.btnDate.setText(mainActivity.pickerStringTodate(strdate));

//Here is your new line
repeatEntryList.setDate(mainActivity.pickerStringTodate(strdate))


                                try {
                                    Date date1 = mainActivity.dateFormat.parse(viewHolder.btnDate.getText().toString());
                                    Date date2 = mainActivity.dateFormat.parse(mainActivity.dateFormat.format(new Date()));
                                    if (date1.before(date2)) {
                                        Toast.makeText(contx, "You cannot select past date", Toast.LENGTH_LONG).show();
                                        viewHolder.btnDate.setText(mainActivity.dateFormat.format(new Date()));
                                    }
                                } catch (ParseException e) {
                                    e.printStackTrace();
                                }
                            }
                        }).setNegativeButton("Cancel", null);
                        datePickerTo.show();
+3

if:

if (date1.before(date2)) { 
    Toast.makeText(contx, "You cannot select past date", Toast.LENGTH_LONG).show();
    viewHolder.btnDate.setText(mainActivity.dateFormat.format(new Date()));
}else{viewHolder.btnDate.setVisibility(View.GONE);}

. else .

+2

All Articles