Я делаю сетевой вызов в своем адаптере 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()){
Поскольку загрузка – это асинхронная задача, это будет не так, как привязка, поэтому вы просто очищаете старую, для текстов, которые сразу доступны для установки.