Как разработчику Android, очень важно выяснить, как вы можете разработать свое приложение максимально эффективно. Когда дело доходит до демонстрации ряда элементов на экране, было бы слишком дорого раздувать их обычным способом, поскольку это значительно повлияло бы на использование данных. Таким образом, используя AdapterView, такой как ListView
, GridView
или Spinner
, и адаптер, такой как ArrayAdapter
поможет нам сократить использование ресурса.
Почему AdapterView и Adapter?
Когда у вас есть ряд элементов для отображения на экране, есть несколько способов добиться этого. Один из способов – использовать LinearLayout
и заполнить дочерние представления с помощью цикла. Однако такой подход не является предпочтительным, поскольку он потребляет довольно много памяти. Представьте, что в вашем списке есть куча элементов для демонстрации, например, временная шкала для социальных сетей или лента статей или новостей. Довольно просто, что вашему приложению потребуется так много ресурсов для создания всех этих списков элементов. Но что, если есть лучший способ, чтобы ваше приложение не использовало огромное количество ресурсов при заполнении этих представлений? Именно тогда использование комбинации AdapterView и Adapter пригодится, поскольку вы можете повторно использовать представления.
Что такое Переработка просмотров?
Переработка представления – это очень мощная и важная концепция для понимания. Что он делает, так это то, что представление перерабатывается, как следует из названия. Вероятно, вы могли бы догадаться об этом, однако, что именно происходит за кулисами? Чтобы понять это, давайте внимательно посмотрим на него.
В этой статье мы предполагаем, что мы хотим, чтобы наш список элементов отображался в виде простого списка, используя ListView в качестве одного из AdapterView
, а список данных хранится в Список массивов
поэтому мы решили работать с ArrayAdapter
в качестве нашего адаптера.
Давайте начнем с представления на высоком уровне. Когда ListView
соединен с ArrayAdapter
, the ArrayAdapter
начните заполнять дочерние элементы/списка ListView
до тех пор, пока в нем не будет достаточно элементов, чтобы заполнить всю высоту экрана. Здесь, пожалуйста, обратите внимание, что никакого дополнительного представления не создается. Таким образом, если 5 элементов могут занимать экран, на данный момент создается только 5 строк. Затем, когда пользователь прокручивает экран, чтобы просмотреть список, элемент исчезает с экрана и сохраняется в памяти, чтобы его можно было повторно использовать позже. Я бы подумал об этом как о том, что меня отправили в такое место, как свалка металлолома. Что касается нового элемента, который появляется на экране, он создается путем повторного использования старой строки из кучи мусора (данные будут обновлены в соответствии с новым элементом).
Повторив этот процесс, вы можете успешно сэкономить использование ресурса, поскольку количество строк, которые необходимо создать, невелико (вероятно, до менее 10), даже если ваш список окажется очень длинным.
Как использовать ListView с базовым ArrayAdapter
Давайте начнем с рассмотрения того, как мы можем настроить представления рециркуляции с помощью примера ситуации. Допустим, вы хотите отобразить имена учащихся на экране вашего приложения с минимальным оформлением. Это означает, что вам нужен один TextView
в качестве элемента вашего списка. В этом случае все, что вам нужно сделать, это инициализировать ArrayAdapter
и подключите его к вашему ListView
.
// Instantiate an ArrayAdapter ArrayAdapter studentNameAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, students); // Getting an ID of ListView ListView listView = (ListView) findViewById(R.id.list); // Connect ListView and Adapter listView.setAdapter(studentNameAdapter);
Во-первых, мы создаем экземпляр ArrayAdapter
передав 3 аргумента: контекст
, макет и массив данных. Мы передали this
для Контекста
, поскольку он представляет текущую активность. Мы выбрали simple_list_item_1 для макета, который содержит только один TextView
. И здесь мы предполагаем, что существует ArrayList
с именем students, содержащий ряд имен студентов, который был передан в качестве нашего 3-го аргумента.
Со всеми этими подробностями, предоставленными, ArrayAdapter
знает, что делать. Итак, все, что осталось сделать, это установить Adapter
с вашим ListView
. Я бы сказал, что ArrayAdapter
довольно удобен в работе!
Пожалуйста, обратите внимание, что по умолчанию ArrayAdapter
возвращает только один Вид
. Это ключевой момент, когда вы хотели бы отобразить больше, чем просто имена учащихся.
Демонстрация более подробной информации в вашем списке
До сих пор наш список содержал только одну информацию – имя студента. Но что, если вы хотите отобразить в списке больше деталей, таких как уровень студента и изображение профиля? Однако ожидается, что ArrayList
вернет одно Представление
… Похоже, нам нужно внести некоторые коррективы, чтобы учесть наши новые данные.
Вот список того, что нужно сделать:
- Создайте новый объект для хранения всех типов данных (2
TextView
s и 1Просмотр изображений
) - Настройте
ArrayList
для хранения вновь созданного объекта (содержит имена, уровни и изображения профиля) - Создайте пользовательский
ArrayAdapter
для обновления поведения методаgetView()
по умолчанию, чтобы он мог возвращатьView
, содержащий несколько данных
Давайте пройдемся по ним один за другим. Первый шаг – создать новый объект, чтобы мы могли хранить нужные нам данные. Помните, что поля, которые мы хотим настроить, предназначены для имени, уровня и изображения профиля. Чтобы создать новый класс с требуемыми полями, выполните следующие действия:
// Student.java public class Student { private String mName; private String mLevel; private int mImageResourceId; public Student(String name, String level, int imageResourceId) { mName = name; mLevel = level; mImageResourceId = imageResourceId; } public String getName() { return mName; } public String getLevel() { return mLevel; } public int getImageResourceId() { return mImageResourceId; } }
Мы создали новый общедоступный класс под названием Student. Убедитесь, что вы установили свою переменную private
чтобы он не был обновлен кем-то случайно. Кроме того, установите методы получения общедоступными, чтобы мы могли получить доступ к деталям позже. После настройки этого объекта обязательно обновите свой список данных, чтобы учесть эти 3 детали. Ваш ArrayList
теперь должен выглядеть следующим образом:
// Create an ArrayList with Student obj ArrayListstudentList = new ArrayList (); // Assign each details studentList.add(new Student("Jane", "Beginner", R.drawable.jane)); studentList.add(new Student("Bob", "Intermediate", R.drawable.bob)); studentList.add(new Student("Lisa", "Advanced", R.drawable.lisa)); ...etc
Далее нам нужно создать пользовательский Адаптер
путем расширения ArrayAdapter
. Вы можете назвать его как угодно, но в этом примере мы называем его StudentAdapter.
// Creating a custom adapter by extending ArrayAdapter with Student data public class StudentAdapter extends ArrayAdapter{ // Set a custom constructer public StudentAdapter(Activity context, ArrayList studentList) { // The second parameter is 0 as we won't use constructer to inflate the views. super(context, 0, studentList); } @Override public View getView(int position, View convertView, ViewGroup parent) { // Check if the existing view is being reused, otherwise inflate the view manually View listItemView = convertView; if(listItemView == null) { listItemView = LayoutInflater.from(getContext()).inflate( R.layout.list_item, parent, false); } // Get the Student object located at the given position Student currentStudent = getItem(position); // Set up one of the TextViews with the name text obtained from the Student object TextView studentName = (TextView) listItemView.findViewById(R.id.name); studentName.setText(currentStudent.getName()); // Set up the other TextView with the level text obtained from the Student object TextView studentLevel = (TextView) listItemView.findViewById(R.id.level); studentLevel.setText(currentStudent.getLevel()); // Set up the ImageView with the resource ID obtained from the Student object ImageView imageView = (ImageView) listItemView.findViewById(R.id.image); imageView.setImageResource(currentStudent.getImageResourceId()); // Return the list item layout (containing 2 TextViews and an ImageView) return listItemView; } }
Здесь мы создали пользовательский адаптер под названием Student Adapter, расширив ArrayAdapter
. Мы также указали, какие данные мы используем для адаптера, добавив <Студент>
. Внутри этого мы установили super
constructor (унаследованный от ArrayAdapter
) – здесь следует отметить одну вещь: мы не указывали макет. Это потому, что мы хотим, чтобы об этом позаботился метод getView()
.
Переходя к переопределяющему методу getView()
, мы сначала проверяем, есть ли в нем что-то convertView
, что означает, есть ли какие-либо старые строки в куче мусора. Если нет, нам нужно увеличить количество просмотров вручную. В большинстве случаев это необходимо, когда действие только что было указано (например, пользователь только что открыл экран).
Если он содержит строки, то мы можем указать, что нужно сделать, прежде чем возвращать одно представление. В нашем случае мы установили тексты имени и уровня (полученные из объекта Student) в TextView
соответственно и 1 идентификатор ресурса изображения в ImageView
. Мы определили, какие данные учащихся следует обрабатывать, используя метод GetItem()
с информацией о местоположении, которая изначально поступает из ListView
.
После завершения всего вышеперечисленного нам просто нужно установить ListView
с созданным экземпляром StudentAdapter в качестве нашего последнего шага.
// Instantiate the custom ArrayAdapter called StudentAdapter StudentAdapter adapter = new StudentAdapter(this, studentList); // Getting an ID for the ListView ListView listView = (ListView) findViewById(R.id.list); // Set an adapter listView.setAdapter(adapter)
Резюме
Мы прошли путь от базового к пользовательскому использованию ListView
и ArrayAdapter
. Это один из способов, которым я недавно научился отображать список элементов. Я почти уверен, что в ближайшем будущем столкнусь с альтернативами. Когда я это сделаю, я напишу другие статьи, чтобы оценить их!
Если вы знаете альтернативы или какие-либо предложения по улучшению моего подхода, пожалуйста, не стесняйтесь оставлять комментарии. Я только начал изучать Java 2 недели назад и готов усвоить как можно больше на протяжении всего своего путешествия! Спасибо за чтение 😄
Оригинал: “https://dev.to/tomokawaguchi/utilising-listview-and-arrayadapter-in-java-20i0”