Android Gallery View и адаптер getView вызывают много раз - PullRequest
1 голос
/ 22 февраля 2012

У меня есть Галерея, к которой подключен адаптер.В методе getView у меня есть пользовательский макет, поэтому я могу отображать вместе изображение и подпись

Изображение загружается с URL-адреса, что выполняется асинхронно и работает как положено.

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

позвольте мне быть ясным, в настоящее время у меня есть активность, и он имеет только один вид, который является галереей.

проблема возникает, когда я проводя, изображение отскакивает и остается на том же изображении.мне нужно многократно пролистывать, жестко и долго, затем я могу перейти к следующему изображению.

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

, если я удаляю удаленную часть загружаемого изображения или просто использую статическийИзображение с телефона, у меня больше нет проблем, на самом деле, getView вызывается только один раз, с правильной позицией.

Я очень расстроен, не уверен, в чем проблема, может быть, потому чтоя загружаю изображение асинхронно, что приведет к обновлению изображения, что заставляет getView вызываться снова, чтобы перерисовать себя?я не уверен ..

пожалуйста, помогите

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

К сожалению, это ошибка с галереей.Списки просмотра будут хорошо прокручиваться независимо от асинхронного обновления данных.Однако галерея просто не закодирована в соответствии с представлением списка

Когда галерея пытается обновить видимое представление (из-за обратного вызова при загрузке изображения), это представление «привязывается» обратно к сфокусированной позиции.Если вы изменяете представление каким-либо образом во время прокрутки, он будет привязан.Вероятно, поэтому вам придется сильно прокрутить, чтобы уйти от текущего представления.Он пытается выполнить обратный вызов для вашего представления, и только быстрая прокрутка предотвратит повторный вызов до того, как вы отойдете от этого представления.

Я уже сообщал об этой ошибке некоторое время назад здесь: Проблемы с Android Здесь опубликовано несколько обходных путей, которые можно попробовать, если вы настроены на использование галереи.

К сожалению, это не привлекло внимание разработчиков Android.Кажется, проблема вызвана тем, что представления имеют значение «wrap_content», а галерее приходится переоценивать / перерисовывать свои представления

С тех пор я перешел от использования галереи и вместо этого использовал ViewPager.Намного легче управлять, и вам не нужно беспокоиться об этой проблеме.Это было известной проблемой с Галереей, так как галерея была впервые представлена.Я понятия не имею, было ли это исправлено в любой из более новых версий Android (3.x / 4.x).По состоянию на 2.3.7 он не зафиксирован.

0 голосов
/ 22 февраля 2012

Сначала вы должны заметить: любой AdapterView (Gallery, ListView и т. Д.) Не гарантирует, что при каждом вызове метода getView () он будет передавать один и тот же параметр экземпляра View.Это только гарантирует, что каждый вид будет иметь одинаковый тип (см. Adapter.getIntemViewType () метод docs)

Таким образом, когда вы начинаете загрузку изображения, вы должны только указать положение элемента.Затем после загрузки изображения вы должны связать указанный ImageView с загруженным изображением в вызове метода Adapter.getView ().

Взгляните на ImageDownloader из примеров Android здесь

Другой подход заключается в использовании WeakHashMap, чтобы содержать карту представлений адаптера к его позициям.Я могу предоставить вам образцы кода, если вам нужно.

...