我知道存在類似的問題,我一直在關注這裏發佈的大量代碼,但是沒有一個適用於我的適配器。我也不是使用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