Android ListView пытается повторно использовать видимую ячейку после вызова setImageBitmap с асинхронно загруженным растровым изображением

#android #listview #android-listview #convertview #getview

#Android #listview #android-listview #convertview #getview

Вопрос:

У меня очень странное поведение, когда адаптер ListView предоставляет в метод getView одни и те же convertViews, даже если все они видны:
getView(); 0; holder: ViewHolder@4289bde8
getView(); 1; holder: ViewHolder@4289bde8
getView(); 4; holder: ViewHolder@4289bde8
getView(); 2; holder: ViewHolder@4289bde8
getView(); 3; holder: ViewHolder@4289bde8

Это происходит, только если я вызываю setImageBitmap с асинхронно загруженным изображением. Если этот метод вызывается со статическим растровым изображением (например, растровым изображением из ресурсов) — все работает так, как задумано:
getView(); 2; holder: ViewHolder@426fd408
getView(); 1; holder: ViewHolder@42899128
getView(); 0; holder: ViewHolder@4289bdf0
getView(); 4; holder: ViewHolder@4289b598
getView(); 5; holder: ViewHolder@4289b480

Ответ №1:

Для меня это стало большим сюрпризом, но проблема была связана с моей опечаткой, когда я случайно указал android:layout_height="wrap_content" для ListView. Сразу после того, как я изменил его на правильное android:layout_height="match_parent" значение, механизм рециркуляции начал работать корректно даже для асинхронных растровых изображений!