简体   繁体   English

在ListView中更改一个EditText会更改所有

[英]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. 我也没有像其他许多人一样使用ViewHolders ,因为我不太了解它们的用途。

In my adapter class I wanted editing an editText to change its corresponding value in my ArrayList of event objects. 在我的适配器类中,我想编辑一个editText来更改其在事件对象的ArrayList的相应值。 However now changing one's event EditText field changes them all, even though I use mobileArrayList.get(position) . 但是,即使我使用mobileArrayList.get(position) ,现在更改事件的EditText字段也将全部更改。

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. 我还应注意,一旦对事件EditText字段起作用,我将对其他两个字段执行相同的操作。 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) . 编辑:如果我尝试将其与ViewHolders一起使用,则当我尝试分配第一个holder.events = (EditText) convertView.findViewById(R.id.events)时,它将引发NPE。 Here is the code using ViewHolders: 这是使用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;
}

} }

尝试删除if(convertView == null)条件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM