我知道存在类似的问题,我一直在关注这里发布的大量代码,但是没有一个适用于我的适配器。我也不是使用ViewHolders
像很多其他人一样,因为我真的不明白他们的用途。在ListView中更改EditText更改全部
在我的适配器类中,我想编辑一个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而不是它,它会抛出一个NPE,当我尝试分配第一个holder.events = (EditText) convertView.findViewById(R.id.events)
。下面是使用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;
}
}
你必须使用查看持有人的概念,或更好地去回收查看 – Redman
你在哪里使用notifyDataSetChanged? –
@CharukaSilva我没有在这里,如果有帮助,我可以发布我的主要活动。它似乎改变这里显示的值没有它 – Johnny