Как обновить изображения в RecyclerView? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть RecyclerView изображений, которые пользователь может редактировать непосредственно в самом RecyclerView.

Редактирование в порядке и работает хорошо.Это делается на растровом изображении, которое накладывает изображения, а затем сохраняет любые изменения в файл изображения.Как только пользователь прокручивает представление реселлера, растровое изображение уничтожается и становится невидимым.

Проблема в том, что любые изменения, сделанные пользователем, не видны при прокрутке.Они прокручивают СТАРОЕ изображение, а не ИЗМЕНЕННОЕ изображение.Они должны выйти из рециркулятора и вернуться в него, чтобы увидеть изменения.

Итак, как заставить RecyclerView перезагрузить только что сохраненное изображение.Я использую Glide в своем адаптере, и, как вы можете видеть, у меня кеширование, основанное на времени сохранения изображения.и принудительно перезагрузить образ?

Я использую DiffUtil на адаптере.Насколько я понимаю, мне не нужно использовать notifyDataSetChanged (), когда вы используете DiffUtil.Но я не понимаю, как вы уведомляете об изменении изображения.

Я не знаю, является ли Diff Callback проблемой.Для чего это стоит, вот оно.Он не смотрит на сам файл изображения, а только на имя файла изображения.Возможно, потому что имя не меняется, изображение не обновляется.Но я не хочу менять имя файла при каждом редактировании.

class PageDiffCallback : DiffUtil.ItemCallback<Page>() {

    override fun areItemsTheSame(oldItem: Page, newItem: Page): Boolean {
    return oldItem.id == newItem.id
  }

  override fun areContentsTheSame(oldItem: Page, newItem: Page): Boolean {
    return oldItem == newItem
  }
}

спасибо!

Джон

1 Ответ

0 голосов
/ 13 апреля 2019

Дело в том, что вы не обновляете весь элемент в своем представлении переработчика, это строка.NotifyDataSetChanged () принудительно обновит данные, как вы сказали, но в этом случае также обновит ваш макет.

С помощью DiffUtil, помимо содержимого, вы также сравниваете, совпадают ли элементы, какими они являются, поскольку вы сравниваете их ID, и это не меняется при обновлении изображения.

Прежде чем пытаться с notifyDataSetChanged () tho, не могли бы вы попытаться сделать это в вашем areContentsTheSame() методе:

override fun areContentsTheSame(oldItem: Page, newItem: Page): Boolean {
return oldItem.id == newItem.id && oldItem.image == newItem.image // If you want just add more validations here
}
...