3

У меня в ListView есть 30 элементов. Если в нулевой элементе я что-то напишу, то при пролистывании вниз эти данные могут оказаться вообще внизу, или даже на месте 4 12 15 28.

Поэтому я решил, что будет лучше, если в ListView отключить как-то пересоздание компонентов.

Или в EditText поймать тот момент, когда человек теряет фокус, чтобы я сохранил данные в файл, а после - считал их.

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = getLayoutInflater().inflate(R.layout.main_list, null);
    }
    EditText editText = (EditText)convertView.findViewById(R.id.editText);
    editText.setHint("asdsadad");
    // SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
    // sharedPreferences.getString("pos" + position, "");
    return convertView;
}
pavlofff
  • 36,765
Andro
  • 3,471
  • 15
  • 49
  • Вы очевидно неправильно используете механизм переиспользования элементов. Покажите в каком месте вы меняете значение вью, кое потом показывается в других элементах. – ЮрийСПб Oct 23 '15 at 17:02
  • Кстати еще одна вещь странная. Если активрировать EditText и пролистывать ListView то где - то на 10 элемиенте фокус встанет на 10 элемент. Чо за? – Andro Oct 23 '15 at 17:47
  • 1
    Используйте в вашем Адаптере паттерн ViewHolder, либо вместо ListView используйте недавно появившийся компонент RecycleView – Werder Oct 23 '15 at 18:52
  • RecycleView лучше? А там точно заработает эта фишка? – Andro Oct 23 '15 at 20:07

1 Answers1

3

Так как айтемы многократно переиспользуются, вам необходимо позаботиться о восстановлении состояния конкретного айтема в определенной позиции, для этого вам нужно сохранять ввод из EditText-ов в отдельное хранилище, которое будет привязано к позициям в списке и затем использовать эти данные при (пере-)создании айтема. Необходимо не только восстанавливать ввод, но и принудительно очищать EditText, если ввода в нем не было. Смотрите этот ответ для более подробного решения.

Для извлечения данных из айтемов списка в EditText при потере фокуса смотрите этот ответ (пункт2).

Что вы будете использовать, ListView или RecyclerView не имеет особого значения. Так же как для решения вашей проблемы не подойдет и паттерн ViewHolder (хотя его использование и очень рекомендуется), который хранит только ссылки на виджеты (исключает многократный вызов метода findViewById()), а не содержимое этих виджетов.

pavlofff
  • 36,765