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

标签 java android listview arraylist android-edittext

我知道有类似的问题,我一直在关注此处发布的大量代码以达到这一点,但它们都不适用于我的适配器。我也没有像许多其他人一样使用ViewHolders,因为我并不真正理解它们的用途。

在我的适配器类中,我想编辑一个 editText 来更改它在我的事件对象的 ArrayList 中的相应值。然而,现在更改一个事件的 EditText 字段会更改所有事件,即使我使用 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;
}

}

我还应该注意,一旦我为事件 EditText 字段工作,我也会对其他两个字段做同样的事情。谢谢

编辑:如果我尝试将它与 ViewHolders 一起使用,当我尝试分配第一个 holder.events = (EditText) convertView.findViewById(R.id.events) 时它会抛出 NPE .这是使用 ViewHolder 的代码:

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) 条件。

关于java - 在 ListView 中更改一个 EditText 会更改所有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41179985/

相关文章:

java - 线程 "main"java.lang.NoClassDefFoundError : HelloWorld 中的异常

java - 由于 Java 无法运行 SDK Manager

android - android中多种listview布局行的通用适配器

php - 使用 JSON 数据从 Android 发送数据到服务器

c# - 在 ListView 中强制调整 GridView 列的大小

java - SearchView 过滤器 ListView

javac 选项以递归方式编译给定目录下的所有 java 文件

java - Spring Data Neo4J 中是否有 Multi-Tenancy 数据源

java - 在匿名线程中使用最终变量

android - 由于缺少 Open Mobile API 共享库,应用安装失败