我知道有类似的问题,我一直在关注此处发布的大量代码以达到这一点,但它们都不适用于我的适配器。我也没有像许多其他人一样使用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/