Intereting Posts
Как реализовать Flipboard ipad для поворота страницы для просмотра flipper в android? Как сохранить изображения с помощью sharedpreference в android? Начиная с Android: Java или Python (SL4A) Связь с Android to node.js Линейный градиент оттягивается от заданного положения Украшение RecyclerView (с помощью GridLayoutManager) для отображения разделителя между элементами Как добавить проект Android Studio в GitHub Поддержка Android v7 MediaRouter иногда не работает должным образом Android – Как запустить Сервис в другой теме, чем основной поток? Как добавить индикатор «меню» рядом с значком приложения «Панель действий»? Ubuntu 64 с Android 64 Bundle не может найти исполняемый файл adb Требуется ли для библиотеки V2 Maps разрешение ACCESS_NETWORK_STATE? Создать экземпляр всех элементов в представлении пейджера android Android, как поставить диалоговое окно после нажатия кнопки «Назад» Android Deep Linking с несколькими параметрами запроса

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

У меня есть ListView с пользовательским ArrayAdapter . Каждая строка в этом ListView имеет значок и некоторый текст. Эти значки загружаются в фоновом режиме, кэшируются, а затем используются обратные вызовы, заменяемые в соответствующих ImageViews . Логика получения эскиза из кеша или загрузки запускается каждый раз при getView ().

Теперь, по словам Ромена Гая:

«Нет абсолютно никакой гарантии того порядка, в котором будет вызываться getView (), и сколько раз».

Я видел, как это произошло, для строки размером два getView () вызывается шесть раз!

Как мне изменить код, чтобы избежать дублирования эскизов-выборки-запросов, а также обрабатывать просмотр?

Благодарю.

Solutions Collecting From Web of "Лучший способ обработки нескольких вызовов getView внутри адаптера"

Из 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 

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

 android:layout_height="wrap_content" 

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

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

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

Я экспериментирую с той же проблемой, я меняю layout_height listView на match_parent, чтобы решить мою проблему.

Я понимаю, что здесь нужно использовать шаблон дизайна ViewHolder. Простое использование возвращаемого convertView может привести к повторному использованию предыдущего представления (с некоторым другим изображением, назначенным в этом случае).

 public class ImageAdapter extends ArrayAdapter<String> { // Image adapter code goes here. private ViewHolder { public ImageView imageView; public String url; } @Override public View getView(final int position, View convertView, ViewGroup parent) { View view = null; ViewHolder viewHolder; String url = getUrl(position); if (convertView == null) { // There was no view to recycle. Create a new view. view = inflator.inflate(R.layout.image_layout, parent, false); viewHolder = new ViewHolder(); viewHolder.imageView = (ImageView) view.findViewById(R.id.image_view); viewHolder.url = url; view.setTag(viewHolder); } else { // We got a view that can be recycled. view = convertView; viewHolder = ((ViewHolder) view.getTag()); if (viewHolder.url.equals(url)) { // Nothing to do, we have the view with the correct info already. return view; } } // Do work to set your imageView which can be accessed by viewHolder.imageView return view; } } 

У моего Fragment.xml есть ListView, параметр компоновки этого ListView был android: layout_height = "wrap_content" , и этот ListView будет связываться с SimpleCursorAdapter позже. Тогда у меня такая же проблема в ViewBinder вызывается 3 раза. Проблема была решена после того, как я изменил layout_height = "wrap_content" на "95p". Я считаю, что высота «wrap_content» вызывает эту проблему. Попытка изменить ваш Fragment.xml, и я думаю, что 3-тактная проблема будет больше не существовать.