#android #string #gridview #textview #android-edittext
#Android #строка #просмотр сетки #textview #android-edittext
Вопрос:
У меня есть GridView, который отображает пользовательский макет в несколько десятков строк, каждая из которых состоит из EditText и объекта TextView.
Если я правильно понимаю, я должен расширить класс BaseAdapter для достижения этой цели. Если да, то как я могу получить доступ к определенному объекту EditText?
Кроме того, приведет ли повторное использование представлений к потере текста, введенного пользователем, если одно из представлений EditText больше не отображается?
Есть ли более простое средство для выполнения того, что я здесь описываю (возможно, что-то другое, чем GridView)?
Комментарии:
1. вы нашли решение для этого?
Ответ №1:
При расширении BaseAdapter
один из методов, который вам приходится переопределять, является getView(...)
. В этом методе вы создаете представление, которое необходимо отобразить. Если вы хотите сохранить текст, введенный в EditText
, что вам нужно сделать, это установить a TextWatcher
в EditText, передавая позицию EditText (параметр в getView(...)
), и всякий раз, когда текст изменяется, сохранять текст в массиве сортировки. Затем, всякий раз, когда эта позиция возвращается с помощью getView(...)
метода, извлеките текст из массива и заполните EditText
.
Комментарии:
1. Звучит выполнимо, но сложно. Было бы намного проще просто использовать TableLayout для этого (количество строк не должно превышать 100)?
2. Если все ваши ячейки идентичны в том смысле, что в каждой из них есть EditText и TextView, то было бы не проще использовать TableLayout. Преимущество использования адаптера заключается в том, что позиции, которые находятся за пределами экрана, не сохраняются в памяти, что обеспечивает небольшой объем памяти. Всякий раз, когда вы прокручиваете, виды, удаляющиеся с экрана, повторно используются для создания представлений, появляющихся на экране.
3. Я вижу, что когда я использую TextWatcher, есть три метода, которые я вынужден переопределить. Чтобы обновить мой массив строк обновленным текстом, я должен знать, к какому объекту EditText принадлежит этот новый текст (который я использую для получения правильного индекса в моем массиве строк). «Знает» ли редактируемый объект, какой это?
4. Вот почему я говорил передавать позицию при создании пользовательского
TextWatcher
класса. Имейте в виду также, что вы «добавляете» TextWatchers, поэтому вы можете назначить несколько из них одному EditText. Имейте это в виду, чтобы не добавлять дополнительные средства просмотра текста при повторном просмотре представления.
Ответ №2:
Вы должны использовать базовую структуру данных (скажем, список), которая должна содержать данные для каждого элемента сетки.
TextView и EditText должны быть заполнены из этого списка.