У меня есть экран (см. Рисунок), который заполняется GridView с использованием собственного расширения BaseAdapter.
Когда пользователь вводит какой-либо текст в поля EditText, введенный им текст может сместиться или полностью исчезнуть. Я предполагаю, что это связано с переработкой представлений, но мое понимание listadapters плохое.
Поля ведут себя нормально изначально благодаря записи Manifest android: windowSoftInputMode = "AdjustPan", но они перемещаются, если вы прокручиваете хаотично.
Все, что я хочу сделать, это получить некоторые строковые данные от пользователя. Строки хранятся в глобальном массиве строк «strings []». Массив строк обновляется MyTextWatcher, который является просто расширением TextWatcher.
Код (пытается) обеспечить, чтобы TextWatchers всегда знали положение своего поля EditText в сетке. Таким образом, TextWatchers всегда должны обновлять строки [] с правильным индексом.
У меня есть все основания полагать, что проблема связана с моим методом getView ():
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);
}