Прежде всего, вы действительно не хотите предотвращать повторное использование представлений списка. Просмотр утилизации - это огромная оптимизация. Для получения действительно полезной информации о списках см. Google IO talk: http://www.youtube.com/watch?v=wDBM6wVEO70
При этом вы правильно определили свою проблему: у вас намного меньше правок EditTexts, чем у элементов в вашем списке. Когда вы прокручиваете список, эти EditTexts перерабатываются, и вы снова и снова видите один и тот же ввод.
По сути, вам нужно сохранить входные данные для ваших EditTexts в некоторой структуре данных (HashMap, если они будут редактировать только несколько значений, возможно, List, если они будут изменять большинство значений, либо будет работать), который отображает положение для входа. Вы можете сделать это, добавив textChangedListener к вашим текстам редактирования в getView:
@Override
public View getView(final int position, View convertView, ViewGroup parent){
...
cursor.moveToPosition(position);
int label_index = cursor.getColumnIndex("userword");
String label = cursor.getString(label_index);
holder.text.setText(label);
//clear whatever text was there from some other position
//and set it to whatever text the user edited for the current
//position if available
String oldText = yourMapOfPositionsToValues.get(position);
holder.setText(oldText == null ? "" : oldText);
//every time the user adds/removes a character from the edit text, save
//the current value of the edit text to retrieve later
holder.edittext.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable editable) {
yourMapOfPositionsToValues.put(position, editable.toString());
}
....
};
return convertView;
}
Всякий раз, когда ваш пользователь заканчивает редактирование, вы можете просматривать структуру данных и делать с этими значениями все, что угодно.
Edit:
Я изменил onTextChanged на afterTextChanged, потому что я использовал это раньше, и я знаю, что это работает. Имейте в виду, что afterTextChanged вызывается каждый раз, когда изменяется LETTER, а не только после того, как пользователь заканчивает вводить слово. Если пользователь вводит «dog», то afterTextChanged будет вызываться три раза, сначала с «d», затем с «do», затем с «dog».
HashMap прост: отобразите yourMapOfPositionsToValues = new HashMap ();
для добавления или обновления элемента: yourMap.put (position, someText);
чтобы получить элемент: yourMap.get (position);
если хешмапы не имеют смысла, потратьте некоторое время на их изучение. Это невероятно важная структура данных.
Ваша реализация TextWatcher неверна. Ваша структура данных должна принадлежать не одному представлению, а деятельности или вашему адаптеру. Вам кажется, что позиции не стабильны, потому что ваш список принадлежит каждому представлению. Сами позиции стабильны в том смысле, что если базовые данные не изменятся, курсор будет возвращать одни и те же данные каждый раз для одной и той же позиции. Однако текст редактирования используется для нескольких различных позиций.
Создайте хеш-карту в качестве переменной экземпляра, которую я продемонстрировал выше, в конструкторе вашего адаптера. Затем добавьте именно тот TextWatcher, который я написал изначально, нет необходимости в именованном классе, проще анонимный. Ваш код должен работать.