I have a screen (see picture) that is populated by a GridView using a custom extension of BaseAdapter.
When the user enters some text into the EditText fields, the text
I would again preface this, as in the other answer, by saying I wouldn't implement it this way. You're doing scary stuff. Carrying lots of references around. However, I think this should help:
Map<EditText, MyTextWatcher> watchers = new HashMap<EditText, MyTextWatcher>();
public View getView(int position, View convertView, ViewGroup parent)
{
View MyView = convertView;
if (MyView == null)
{
LayoutInflater li = getLayoutInflater();
MyView = li.inflate(R.layout.shape, null);
}
EditText textbox = (EditText) MyView.findViewById(R.id.shape_edittext);
textbox.setText(strings[position]);
MyTextWatcher myTextWatcher = watchers.get(textbox);
if(myTextWatcher == null)
{
myTextWatcher = new MyTextWatcher(position, textbox);
watchers.put(textbox, myTextWatcher);
}
myTextWatcher.setIndex(position);
ImageView image = (ImageView) MyView.findViewById(R.id.shape_image);
image.setBackgroundResource(images[position]);
TextView text = (TextView) MyView.findViewById(R.id.shape_text);
text.setText("Seq:");
return MyView;
}
The problem here is that you created the TextWatcher, added it to an EditText, but then kept a reference to it in a list by position, so the references between EditText and the TextWatcher were broken.
This solution assumes that 'equals' for EditText will do an object instance compare and not a value compare. If that is NOT the case, you'd need to keep a reference to all EditText instances, and do an '==' compare to each and find a match.
I think there are safer ways to do this, but give it a shot.