I have a screen (see the figure) that is populated by the GridView using the custom BaseAdapter extension.
When a user enters any text in the EditText fields, the text they entered may disappear completely or completely. I suppose this is due to recycling views, but my listadapters are poorly understood.
Fields behave fine due to the Manifest entry in android: windowSoftInputMode = "adjustPan", but they move if you scroll randomly.
All I want to do is get some String data from the user. Strings are stored in the global array String "string []". The string array is updated by MyTextWatcher, which is just an extension of TextWatcher.
Code (attempts) so that TextWatchers always know the position of their EditText field in the grid. Therefore, TextWatchers should always update the [] lines with the correct index.

I have every reason to believe that the problem arises from my getView () method:
public void initList() { ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.shape, strings) { @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null || convertView.getTag() == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.shape, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById(R.id.shape_text); holder.image = (ImageView) convertView.findViewById(R.id.shape_image); holder.editText = (EditText) convertView.findViewById(R.id.shape_edittext); holder.editText.addTextChangedListener(new TextWatcher() { public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2){} public void onTextChanged(CharSequence s, int start, int before, int count) { if (gameType == SHAPES_ABSTRACT && before == 0 && count == 1) { InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); mgr.hideSoftInputFromWindow(holder.editText.getWindowToken(), 0); } } public void afterTextChanged(Editable s) { strings[holder.ref]= s.toString(); } }); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } holder.ref = position; holder.editText.setText(strings[position]); holder.image.setBackgroundResource(images[position]); if (gameType == SHAPES_ABSTRACT) holder.text.setText("Seq:"); else holder.text.setVisibility(View.GONE); return convertView; } }; grid.setAdapter(listAdapter); }
source share