2014-02-09 4 views
1

У меня есть GridView, содержащий ImageView s, я бы хотел обновить View с, если изображение успешно загружено и преобразовано в объект Bitmap. Адаптер GridView имеет метод getView, который может устанавливать изображение по умолчанию или декодировать до Bitmap загруженное изображение, если оно существует.Эффективное обновление GridView child Просмотров

Чтобы обновить GridView можно использовать метод myGridView.getAdapter().notifyDataSetChanged(), поэтому я создал BroadcastReceiver в состоянии обнаружить, если успешно загружен файл один из изображений, мне нужно, и в конечном счете отправить Listener событие в деятельности, содержащий GridView, чтобы обновить его , Поскольку адаптер GridView может содержать даже тысячи элементов, я хотел бы выполнить запуск notifyDataSetChanged, только если видна View для этого конкретного файла.

Я думал сделать что-то вроде этого:

for(int i=0;i<myGridView.getChildCount();i++){ 
    if(myGridView.getChildAt(i).isTheOneINeed) { //notifyDataSetChanged(); break; } 
} 

Но я немного обеспокоен: а что если пользователь прокручивает GridView и childView становится нулевым или он заменен одним из следующих пунктов в Adapter? Есть ли более безопасный способ сделать это?

ответ

3

Мое личное мнение заключается в том, что вы не должны играть с ListView/GridView детьми (если только вы НЕ ДОЛЖНЫ). Если ваши данные изменились, вы должны позвонить notifyDataSetChanged(). ListView/GridView будет перерисовывать только несколько элементов (видимых), даже если у вас их тысячи.

Для оптимизации коды и вызвать notifyDataSetChanged() только когда деталь видна, вы можете получить первые и последние видимые позиции по телефону getFirstVisiblePosition() и getLastVisiblePosition()

+0

Методы 'getVisiblePosition', кажется, то, что я искал! – Vektor88

1

Я предполагаю, что ваш Activity использует AsyncTask для загрузки изображений, которые затем декодируются в методе AdaptergetView(). Если пользователь вашего приложения прокручивается вверх и вниз слишком быстро, ваши изображения могут размываться/заменяться, и ваше приложение может перестать отвечать на запросы, поскольку потоки AsyncTask сходят с ума, пытаясь справиться с кешированием загрузки &, а ваш Adapter борется с расшифровкой.

Вы слышали о новой сетевой библиотеке Volley для Android? Он разработан в Google (его часть AOSP). Я предлагаю вам попробовать, поскольку по умолчанию он асинхронный (он абстрагирует загрузку, кеширование & декодирования, обеспечивая при этом очень чистый интерфейс для разработчика). Я использую его для HTTP-запросов & Скачивание изображения, и его очень быстрое и стабильное. Вы можете даже контролировать приоритет потока & аннулирование. Отсутствует размытие или заикание списков/gridviews, и оно может обрабатывать очень большие изображения с легкостью. Picasso - еще один отличный вариант для загрузки изображения. Picasso немного медленнее, чем волейбол для загрузки изображений, но его как стабильный и TRIVIAL для интеграции (одна строка кода в вашем адаптере).

Volley и Пикассо работать красиво, даже если вы не добавить метод notifyDatasetChanged() вашим Adapter «ы getView() (хотя, конечно, это хорошая практика, чтобы сделать это). Поскольку метод getView() вызывается по требованию, оба загружают только изображение, когда пользователь прокручивается вниз.

См. Пример загрузки изображения с помощью Volley here.

+0

Спасибо за это предложение! Я переключился на Volley, потому что все в нескольких строках кода. Но я не уверен, что могу принять этот ответ, потому что это не прямой ответ на мой вопрос. Будьте уверены! – Vektor88

Смежные вопросы