Лучший способ справиться с загрузкой изображений в пользовательском списке в Android
Я работаю над приложением, где мне нужно показать список пользователей. Список пользователей - это пользовательский список, в котором есть изображения и текстовое представление. Пользовательское изображение будет загружено в это изображение с сервера. Я уже работал с библиотекой Пикассо, и это действительно легко. Я получаю URL изображения вместе с именем пользователя с сервера, используя http запрос. Теперь дело в том, что мне нужно использовать пользовательский список, я реализовал пользовательский адаптер и в методе getView я загружаю изображение, используя
Picasso.with(MainActivity.this).load("http://i.imgur.com/DvpvklR.png").into(container);
Но теперь мой вопрос: когда мне нужно показать 30 пользователей в списке, тогда мне нужно получить изображение 30 пользователей по указанному выше коду. Я не знаю, это лучшая практика или другой способ справиться с таким списком. Опять же, я не знаю, этот список может занимать пользовательскую память. Что я могу знать?
3 ответа
Вот ссылка на Universal Image Loader:
https://github.com/nostra13/Android-Universal-Image-Loader
Это очень настраиваемый и поставляется с кешированием памяти из коробки.
Библиотека Picasso проста в использовании и также содержит кеш, поэтому ваши ресурсы не теряются.
Я использую эту библиотеку в виде списка со многими элементами, и она работает как шарм (так же, как вы делаете).
Так как getView вызывается, когда элемент становится видимым (в основном, когда пользователь выполняет прокрутку), одновременно не будет загружаться много изображений.
Я рекомендую продолжать использовать Picasso и применять шаблон держателя вида в адаптере представления списка (вы улучшите производительность и получите плавные прокрутки).
--- ОБНОВИТЬ ---------------------------------------------- -------------
Краткий пример шаблона ViewHolder, основанный на этом:
"findViewById" использует цикл для обхода элементов внутри представления, поэтому при прокрутке представления списка в него вызывается много вызовов из "getView". Это может вызвать проблемы с производительностью в больших списках.
ListView повторно использует элементы представления, потому что getView получает параметр View. Этот параметр имеет нулевое значение при первом использовании, но позже ранее использованные представления могут быть переданы этому методу.
Идея View Holder - хранить ссылки на подпредставления при создании объекта основного вида, поэтому нет необходимости вызывать findViewById в будущем.
Следуй этим шагам:
Реализуйте класс для хранения ссылок на представление:
статический класс ViewHolderItem { TextView textViewItem; // Добавить столько элементов, сколько вам нужно: флажки, изображения, ... }
Реализуйте getView в своем адаптере следующим образом:
@Override public View getView (int position, View convertView, ViewGroup parent) {ViewHolderItem viewHolder;
// First time: the object is created if(convertView==null){ // inflate the layout LayoutInflater inflater = ((Activity) mContext).getLayoutInflater(); convertView = inflater.inflate(layoutResourceId, parent, false); // Creates the ViewHolder and stores references to views viewHolder = new ViewHolderItem(); viewHolder.textViewItem = (TextView) convertView.findViewById(R.id.textViewItem); // Uses tag to store the holder with the main view. convertView.setTag(viewHolder); } else { // View is beign resused. // Avoids calling findViewById() just use the viewHolder. viewHolder = (ViewHolderItem) convertView.getTag(); } // Gets object item. ObjectItem objectItem = getItem(position); // assign values (if the object is not null) if(objectItem != null) { // Fill data in layout assigning values to views in the view holder. viewHolder.textViewItem.setText(objectItem.itemName); // Set images, check boxes state, or whatever you have in your layout. } // Finally returns the updated view. return convertView;
}
Вы можете использовать библиотеку Universal Image Loader для отображения изображений в своем адаптере.
Там вы можете использовать этот код для отображения изображения.
imageLoader.displayImage(imageUrl, imageView, new ImageLoadingListener()
{
@Override
public void onLoadingStarted(String imageUri, View view)
{
}
@Override
public void onLoadingFailed(String imageUri, View view, FailReason failReason)
{
}
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
{
progress.setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled(String imageUri, View view)
{
}
});
Здесь вы можете увидеть https://github.com/nostra13/Android-Universal-Image-Loader