Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Changing one EditText in ListView changes all

I know there are similar questions like this and I've been following a lot of code posted on here to get to this point, but none of them work to my adapter. I've also not used ViewHolders like many other people do as I do not really understand what they are for.

In my adapter class I wanted editing an editText to change its corresponding value in my ArrayList of event objects. However now changing one's event EditText field changes them all, even though I use mobileArrayList.get(position).

public class CustomAdapter extends ArrayAdapter {

ArrayList<Event> mobileArrayList;


public CustomAdapter (Context context, ArrayList<Event> events){
    super(context, 0, events);
    this.mobileArrayList = events;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent){
    Event event = mobileArrayList.get(position);
    //ViewHolder holder;
    if(convertView == null){
        //holder = new ViewHolder();
       // holder.caption = (EditText) convertView.findViewById(R.id.events);
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_row, parent, false);
    } else {
        //holder = (ViewHolder) convertView.getTag();
    }


    EditText events = (EditText) convertView.findViewById(R.id.events);
    EditText start = (EditText) convertView.findViewById(R.id.start);
    EditText end = (EditText) convertView.findViewById(R.id.end);
    TextView day = (TextView) convertView.findViewById(R.id.day);

    events.setText(event.getSummary());
    start.setText("Start Date: " +event.getDateStart());
    end.setText("End Date: " + event.getDateEnd());
    day.setText(event.getDayOfTheWeek());

    /*holder.caption.setId(position);

    holder.caption.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus){
                final int position = v.getId();
                final EditText events = (EditText) v;
                mobileArrayList.get(position).setSummary(events.getText().toString());

            }
        }
    });*/

    events.addTextChangedListener(new TextWatcher() {
        @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) {
            String edit = s.toString();
            mobileArrayList.get(position).setSummary(edit);
        }
    });

    return convertView;
}

class ViewHolder{
    EditText caption;
}

}

I should also note once I get this working for the events EditText field I will also be doing the same for the other two. Thank you

EDIT: If I try to use this with ViewHolders instead, it throws an NPE when I try to assign the first holder.events = (EditText) convertView.findViewById(R.id.events). Here is the code using ViewHolders:

public class CustomAdapter extends ArrayAdapter {

ArrayList<Event> mobileArrayList;


public CustomAdapter (Context context, ArrayList<Event> events){
    super(context, 0, events);
    this.mobileArrayList = events;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent){
    Event event = mobileArrayList.get(position);
    ViewHolder holder;
    if(convertView == null){
        holder = new ViewHolder();
        convertView = LayoutInflater.from(getContext()).inflate(R.layout.listview_row, parent, false);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }


    /*EditText events = (EditText) convertView.findViewById(R.id.events);
    EditText start = (EditText) convertView.findViewById(R.id.start);
    EditText end = (EditText) convertView.findViewById(R.id.end);
    TextView day = (TextView) convertView.findViewById(R.id.day);
    */

    holder.events = (EditText) convertView.findViewById(R.id.events);
    holder.start = (EditText) convertView.findViewById(R.id.start);
    holder.end = (EditText) convertView.findViewById(R.id.end);
    holder.day = (TextView) convertView.findViewById(R.id.day);

    holder.events.setText(event.getSummary());
    holder.start.setText("Start Date: " +event.getDateStart());
    holder.end.setText("End Date: " + event.getDateEnd());
    holder.day.setText(event.getDayOfTheWeek());

    /*holder.caption.setId(position);

    holder.caption.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus){
                final int position = v.getId();
                final EditText events = (EditText) v;
                mobileArrayList.get(position).setSummary(events.getText().toString());

            }
        }
    });*/

    holder.events.addTextChangedListener(new TextWatcher() {
        @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) {
            String edit = s.toString();
            mobileArrayList.get(position).setSummary(edit);
        }
    });

    return convertView;
}

class ViewHolder{
    EditText events;
    EditText start;
    EditText end;
    TextView day;
}

}

like image 779
Johnny Avatar asked May 04 '26 01:05

Johnny


1 Answers

try removing if(convertView == null) condition.

like image 82
Nithin Avatar answered May 06 '26 14:05

Nithin