0

我有一个 RecyclerView 图像,用户可以直接在 RecyclerView 本身中进行编辑。

编辑部分很好,效果很好。它是在覆盖图像的位图上完成的,然后将任何更改保存到图像文件中。一旦用户滚动recyclerview,位图就会被破坏并变得不可见。

问题是,用户所做的任何更改在滚动时都不可见。他们滚动旧图像,而不是编辑图像。他们必须离开回收站并回到其中才能看到变化。

那么如何强制 RecyclerView 重新加载刚刚保存的图像。我在我的适配器中使用 Glide,你可以看到我有基于图像保存时间的缓存。

class InfinityPageAdapter(val memo: Memo) : ListAdapter<Page, InfinityPageAdapter.ViewHolder>(PageDiffCallback()) {

  class ViewHolder(pageView: View) : RecyclerView.ViewHolder(pageView)

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): InfinityPageAdapter.ViewHolder {
    val pageView = LayoutInflater.from(parent.context).inflate(R.layout.infinity_page_list_item, parent, false)
    return ViewHolder(pageView)
  }

  override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    val page = getItem(position)

    val imageUrl = getMemoPath(memo.uuid) + page.uuid + ".webp"
    if (imageUrl.isNotEmpty()) {
        Glide.with(holder.itemView.context)
                .load(imageUrl)
                .apply(RequestOptions()
                        .signature(ObjectKey(System.currentTimeMillis()))
                        .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                        .override(memo.pageWidth,memo.pageHeight)
                )
                .transition(DrawableTransitionOptions.withCrossFade())
                .into(holder.itemView.findViewById(R.id.memo_page_image))
    }
  } 

有没有办法通知 recyclerview 图像已更改,并强制重新加载图像?

我在适配器上使用 DiffUtil。我的理解是,当您使用 DiffUtil 时,我不需要使用 notifyDataSetChanged()。但我不明白您如何通知图像更改。

我不知道 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
  }
}

谢谢!

约翰

4

1 回答 1

0

这件事是,您没有更新回收站视图中的整个元素,这是一行。notifyDataSetChanged() 将像您所说的那样强制数据更新,但在这种情况下,它也会更新您的布局。

使用 DiffUtil,除了内容之外,您还可以比较项目是否相同,因为您正在比较它们的 ID,并且在更新图像时不会改变。

在尝试使用 notifyDataSetChanged() 之前,您是否可以尝试在您的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
}
于 2019-04-13T07:06:32.683 回答