Лучший способ обрабатывать несколько вызовов getView изнутри адаптера

Строки в Java неизменяемы. Это означает, что всякий раз, когда вы пытаетесь изменить / изменить строку, вы получаете новый экземпляр. Вы не можете изменить исходную строку. Это сделано для того, чтобы эти экземпляры строк могли кэшироваться. Типичная программа содержит множество ссылок на строки и кеширование этих экземпляров, что может уменьшить объем памяти и увеличить производительность программы.

При использовании оператора == для сравнения строк вы не сравниваете содержимое строки , но фактически сравнивают адрес памяти. Если они равны, в противном случае они вернут true и false. Если значение равно в строке, сравнивает содержимое строки.

Итак, вопрос в том, что все строки кэшируются в системе, как получается == возвращает false, тогда как equals возвращает true? Ну, это возможно. Если вы создадите новую строку, например String str = new String("Testing"), вы создадите новую строку в кеше, даже если в кеше уже содержится строка с тем же содержимым. Короче говоря, "MyString" == new String("MyString") всегда будет возвращать false.

Java также говорит о функции intern (), которая может использоваться в строке, чтобы сделать ее частью кеша, поэтому "MyString" == new String("MyString").intern() вернет true.

Примечание: == оператор намного быстрее, чем равен только потому, что вы сравниваете два адреса памяти, но вы должны быть уверены, что код не создает новые экземпляры String в коде. В противном случае вы столкнетесь с ошибками.

13
задан Charles Stewart 24 May 2010 в 14:48
поделиться

4 ответа

Из API.

public abstract View   getView  (int position, View  convertView, 
                                 ViewGroup  parent)

convertView - Старое представление для повторного использования, если возможно. Примечание: перед использованием вы должны убедиться, что это представление не является нулевым и имеет соответствующий тип. Если невозможно преобразовать это представление для отображения правильных данных, этот метод может создать новое представление.

Итак, если getView уже был вызван для этого конкретного индекса, convertView будет объектом View, который был возвращен из этого первого вызова.

Вы можете сделать что-то вроде.

if(!(convertView instanceof ImageView)){
   convertView = new ImageView();
   //get image from whereever
} else {} // ImageView already created
8
ответ дан 1 December 2019 в 21:51
поделиться

Лучше было бы создать объект с эскизом (растровым изображением) и текстом. И прочтите миниатюру, если ее нет в объекте.

0
ответ дан 1 December 2019 в 21:51
поделиться

Создайте массив объектов ImageView в вашем адаптере и кэшируйте их по мере получения (из кэша или из веб). Например, в getView, прежде чем получить ImageView, проверьте, есть ли он уже в вашем локальном массиве, если да, то используйте его, если нет, то получайте, после получения сохраняйте в локальном массиве ImageView для дальнейшего использования.

0
ответ дан 1 December 2019 в 21:51
поделиться

Именно, это может произойти, например, когда у вас есть

android:layout_height="wrap_content"

в определении ListView. Замена на fill_parent/match_parent позволит избежать этого.

14
ответ дан 1 December 2019 в 21:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: