Загрузка изображения в правильное положение в режиме ресайклера

Я делаю сетевой вызов в своем адаптере recycler, чтобы получить URL-адрес для изображения. После получения url я использую универсальный загрузчик изображений для загрузки изображения в изображение. Проблема в том, что когда я не прокручиваю картинки, загружаются в нужное место, но как только я прокручиваю картинки, они накачиваются в неправильном месте. Вот мой адаптер:

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is ViewHolder) { val article = feeds[position] holder.articleTitle.setFont("SourceSansPro-SemiBold.ttf") holder.articleDescription.setFont("OpenSans-Regular.ttf") holder.articleTime.setFont("OpenSans-Light.ttf") mAnimator?.onBindViewHolder(holder.itemView, position) holder.apply { article.apply { articleTitle.text = title articleDescription.text = Html.fromHtml(description) articleTime.text = TimeUtils.convertLongToTime(pubDate) if (image.isBlank()){ //load picture url when it's empty mContext?.doAsync { ImageExtractor.extractImageUrl(link, object : OnImageExtractorListener { override fun onSuccess(url: String) { v("imaaaage success $title $url") mContext?.runOnUiThread { article.image = url //use uil to load the image didn't work so I tried just updating the model //articleImage.displayImage(url) feeds[position] = article notifyItemChanged(position) } val dbo = context.getDatabase() dbo.updateArticleImage(dbo,url,article.id) } override fun onError() { } }) } }else{ articleImage.displayImage(image) isRead?.let { if (isRead!! && !isSaved){ grayScale(holder) } } } container.setOnClickListener { itemClick(this) if (!isSaved){ article.isRead = true feeds[position] = article notifyItemChanged(position) } } } } }else if (holder is LoadingViewHolder){ holder.progressBar.isIndeterminate = true } } 

Мне нужен способ загрузки изображений в их правильных местах, если пользователь прокручивает или нет.

    вам не удалось установить setHasStableIds (true); в конструкторе адаптера и поставьте:

     @Override public int getItemViewType(int position) { return position; } @Override public long getItemId(int position) { return position; } 

    Таким образом, он будет сохранять все изображения в точном положении даже после прокрутки.

    Подумайте об использовании библиотеки для загрузки асинхронного изображения, например, Picasso . Там все обрабатывается для вас, как кеширование, заполнитель …

    В вашем адаптере:

     Picasso.with(context).load("url") .placeholder(R.drawable.user_placeholder).into(imageView); 

    Gradle:

     compile 'com.squareup.picasso:picasso:2.5.2' 

    Это все!

    RecyclerView будет повторно использовать ViewHolders для снижения уровня инфляции и использования памяти.

    Правильный путь в onBindViewHolder – очистить старое состояние View (установив изображение как null) и установить новые.

    Удостоверьтесь, чтобы очистить его все время, когда он появился. (Перед тестированием)

     articleImage.displayImage(null) if (image.isBlank()){ 

    Поскольку загрузка – это асинхронная задача, это будет не так, как привязка, поэтому вы просто очищаете старую, для текстов, которые сразу доступны для установки.