2016-12-16 56 views
1

我知道存在类似的问题,我一直在关注这里发布的大量代码,但是没有一个适用于我的适配器。我也不是使用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; 
} 

}

+0

你必须使用查看持有人的概念,或更好地去回收查看 – Redman

+0

你在哪里使用notifyDataSetChanged? –

+0

@CharukaSilva我没有在这里,如果有帮助,我可以发布我的主要活动。它似乎改变这里显示的值没有它 – Johnny

回答

5

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

+1

多次遇到这个确切的问题,很好的修复 – HaydenKai