Intereting Posts
Получить экземпляр текущей активности android.intent.category.LAUNCHER Android: Почему длинный клик также вызывает обычный щелчок? Ошибка: – Выполнение неудачно для задачи ': app: dexDebug' в андроид-студии Сделайте снимок экрана целиком Используйте «ant clean test» с новейшим sroid sroid. '$ {Renderscript.opt.level}' не является допустимым значением для com.android.ant.RenderScriptTask $ OptLevel Андроида twitter4j аутентификация через установленное приложение Twitter без браузера Запись звука с помощью HTML5 и Javascript Разделить экран в процентах Как сохранить запись в собственный календарь (Android и iOS) в ответном режиме? Разрешения Android M: путают использование функции shouldShowRequestPermissionRationale () Платформа Android: отличия большого размера 800×480 от планшета 1024×600 Получение ширины и высоты изображения с помощью библиотеки picasso Удаленная отладка с Dart Комплект разработчика BTLE (Bluetooth Low energy) – должен иметь профиль близости GetView Vs. BindView в пользовательском CursorAdapter?

Пользовательский адаптер курсора, вызывающий bindView несколько раз

Я страдаю этой проблемой месяцами и месяцами (но сейчас я настраиваю настройку производительности). Тем не менее, мне теперь отчаянно нужно знать, почему мой адаптер считает, что необходимо запустить bindView до 4 раз на записи.

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

Некоторые отладки, чтобы показать, что происходит:

 03-08 14:46:47.980: I/AdapterCursorGrid(20724): newView() 03-08 14:46:48.470: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:48.570: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:48.570: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:48.600: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:48.690: D/AdapterCursorGrid(20724): bindView() Picture creation... 03-08 14:46:49.490: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:49.501: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:49.501: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Picture creation... 03-08 14:46:50.320: I/AdapterCursorGrid(20724): newView() 03-08 14:46:51.170: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:51.180: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:51.190: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:51.190: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.190: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:51.200: D/AdapterCursorGrid(20724): bindView() Picture creation... 03-08 14:46:51.870: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:51.896: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.896: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:51.900: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Picture creation... 

«Avatar empty …» и «Picture creation …» – это просто отладка, которая говорит мне, что она обрабатывает и обновляет 2 отдельных ImageView .

Почему o почему bindView работает столько раз? Каковы причины этого и что я могу сделать, чтобы решить эту проблему?

Логически говоря, я ожидаю, что bindView будет работать один раз (и каждый раз, когда обновляется адаптер), я ошибаюсь, думая об этом?

Solutions Collecting From Web of "Пользовательский адаптер курсора, вызывающий bindView несколько раз"

Операционная система может несколько раз вызвать bindView чтобы он мог правильно и правильно bindView список. Это не ошибка, как это должно быть. Это, наряду с гладкостью прокрутки, является причиной bindView реализации bindView должны быть максимально эффективными. Есть несколько полезных советов и трюков, которые вы можете использовать на странице разработчиков Android .

Я также обнаружил, что bindView вызывался гораздо чаще, чем ожидалось. Моя высота ListView была установлена ​​в wrap_content. После изменения его в match_parent количество вызовов резко сократилось.

Кредит для этого решения подходит к ответу на этот вопрос. Пользовательский CursorAdapater's bindView называется 77 раз … я сделал что-то не так?

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

Внутренне ImageView использует getIntrinsicWidth() и getIntrinsicHeight() чтобы определить, следует ли запрашивать макет.

Попробуйте что-то вроде этого (хотя было бы разумнее отправить текущую ширину / высоту вашей асинхронной нагрузке и изменить размер растрового изображения перед возвратом из фона):

 public void replaceBitmap(ImageView iv, Bitmap bitmap) { Drawable current = iv.getDrawable(); if (bitmap.getWidth() != current.getIntrinsicHeight() || bitmap.getHeight() != current.getIntrinsicHeight()) { bitmap = Bitmap.createScaledBitmap(bitmap, current.getIntrinsicWidth(), current.getIntrinsicHeight(), true); } iv.setImageBitmap(bitmap); }