I have an Android activity in which I have a ListView bound to a custom ArrayAdapter. Each row of the ListView has two EditText (numeric) fields.
The ArrayAdapter i
It looks like a custom ('ViewHolder') class was what I needed in order to keep the references between a EditText and its associated data object properly synchronised on each 'bind' of the data. Also, placing the event listener calls when the convertView object was null in the getView() method meant only one listener was added per EditText object.
Thanks to http://www.vogella.de/articles/AndroidListView/article.html#listsactivity for pointing me in the right direction.
public class CustomAdapter extends ArrayAdapter<DataItem> {
private ArrayList<DataItem> items;
private Activity Context;
public CustomAdapter(Activity context, int textViewResourceId, ArrayList<DataItem> items) {
super(context, textViewResourceId, items);
this.items = items;
this.Context = context;
}
static class ViewHolder {
protected EditText weight;
protected EditText reps;
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
DataItem wed = items.get(position);
if (v == null) {
LayoutInflater inflator = Context.getLayoutInflater();
v = inflator.inflate(R.layout.log_exercise_row, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text1 = (EditText) v.findViewById(R.id.text1);
viewHolder.text2 = (EditText) v.findViewById(R.id.text2);
viewHolder.text1.addTextChangedListener(new CustomTextWatcher(viewHolder, viewHolder.text1));
viewHolder.text2.addTextChangedListener(new CustomTextWatcher(viewHolder, viewHolder.text2));
v.setTag(viewHolder);
viewHolder.text1.setTag(wed);
viewHolder.text2.setTag(wed);
}
else
{
ViewHolder holder = (ViewHolder) v.getTag();
holder.text1.setTag(wed);
holder.text2.setTag(wed);
}
ViewHolder holder = (ViewHolder) v.getTag();
// set values
if(wed.getWeight() != -1)
{
holder.text1.setText(wed.getWeight()+"");
}
else
{
holder.weight.setText("");
}
if(wed.getRepetitions() != -1)
{
holder.text2.setText(wed.getRepetitions()+"");
}
else
{
holder.reps.setText("");
}
return v;
}