abler98
@abler98
Software Engineer

Android. Загрузка изображений в список. Почему так происходит и как это исправить?

Имеется список с изображениями. Код адаптера:
public class InventoryAdapter extends RecyclerView.Adapter<InventoryAdapter.Holder> {

    public static final String TAG = "InventoryAdapter";

    private ImageLoader imageLoader;
    private JSONArray data;

    public InventoryAdapter(ImageLoader imageLoader, JSONArray data) {
        this.imageLoader = imageLoader;
        this.data = data;
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.inventory_list_item, parent, false);
        Holder holder = new Holder(view);
        holder.image = (ImageView) view.findViewById(R.id.inventory_item_image);
        return holder;
    }

    @Override
    public void onBindViewHolder(final Holder holder, int position) {
        try {
            JSONObject item = data.getJSONObject(position);
            final String uri = "https://steamcommunity-a.akamaihd.net/economy/image/class/730/"
                    + item.getString("classid") + "/70fx70f";
            imageLoader.loadImage(uri, new SimpleImageLoadingListener() {
                @Override
                public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                    holder.image.setImageBitmap(loadedImage);
                }
            });
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    @Override
    public int getItemCount() {
        return data.length();
    }

    public static class Holder extends RecyclerView.ViewHolder {
        public ImageView image;
        public Holder(View itemView) {
            super(itemView);
        }
    }

}

Проблема видна на гифке (изображения заменяются во время прокрутки):
dad325aa07b34ffcb6c5a0018492db3a.gif
Для загрузки изображений используется вот эта библиотека: https://github.com/nostra13/Android-Universal-Imag...
  • Вопрос задан
  • 1053 просмотра
Решения вопроса 2
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Это происходит из-за того, что уже ненужные (те, что прокрутились за экран) изображения ставятся в переиспользуемые вьюхи. Что делать - выкинуть UIL(очень его не люблю), взять нормальный Glide или Picasso.
Другой вариант - в tag ImageView запоминать последний запрошенный url, его же запоминать в коллбеке, сравнивать, и, если они не совпадают, картинку не устанавливать.
Имхо, первый вариант лучше.
Ответ написан
artemgapchenko
@artemgapchenko
Запрос на загрузку картинки через image-loader отрабатывает не мгновенно, поэтому у вас и возникает небольшой gap между запросом на загрузку и отрисовкой нового изображения. Я этой библиотекой не пользовался, поэтому есть два варианта:
1. Не подключили или же не до конца настроили работу с кэшем, поэтому изображения всегда грузятся или из сети, или из disk-cache, минуя in-memory cache.
2. С кэшем всё нормально, просто по каким-то причинам загрузчик не успевает сделать так быстро, чтобы смена картинок была незаметной. Перед загрузкой нового изображения или убирайте изображение из ImageView: imageView.setImageResource(0);, или устанавливайте placeholder.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы