如何为图像实现 DiffUtil

How to implement DiffUtil for images

你好,我听说这个库 DiffUtil 提高了回收器视图的性能,因此我的回收器视图包含图像,我最好实现它,但我不知道如何实现

Note: I didn't include the Fragment code so the question doesn't get long but if you want more references to the code please tell me i will update the question

PostAdapter_Home.kt

class PostAdapter_Home(var mcontext: Context, var mUploads: MutableList<Upload?>?) :
    RecyclerView.Adapter<PostAdapter_Home.PostViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder {
        val view: View
        view = LayoutInflater.from(mcontext)
            .inflate(R.layout.post_item_container_home_ex, parent, false)
        return PostViewHolder(view)
    }

    override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
        val shimmer = ColorHighlightBuilder()
            .setBaseColor(Color.parseColor("#F3F3F3"))
            .setBaseAlpha(1f)
            .setHighlightColor(Color.parseColor("#E7E7E7"))
            .setHighlightAlpha(1f)
            .setDropoff(50f)
            .build()
        val shimmerDrawable = ShimmerDrawable()
        shimmerDrawable.setShimmer(shimmer)
        val uploadCurrent = mUploads?.get(position)
        Glide.with(mcontext)
            .load(uploadCurrent?.getmImageUrl())
            .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
            .placeholder(shimmerDrawable)
            .fitCenter()
            .into(holder.imageView)

    }


    override fun getItemCount(): Int {
        return mUploads?.size!!
    }

    //    public long getId() {
    //        return this.id;
    //    }
    //
    //    @Override
    //    public long getItemId(int position) {
    //        return mUploads.get(position).Id;
    //    }
    fun setUploads(uploads: MutableList<Upload?>?) {
        mUploads = uploads
    }
    

    class PostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val imageView: ShapeableImageView

        init {
            imageView = itemView.findViewById(R.id.imagePostHome)
        }
    }
}

Upload.kt

package com.example.myappnotfinal.AdaptersAndMore

import com.google.firebase.database.Exclude

class Upload {
    internal var mImageUrl: String? = null
    private var mKey: String? = null

    constructor() {}
    constructor(imageUrl: String?) {
        mImageUrl = imageUrl
    }

    fun getmImageUrl(): String? {
        return mImageUrl
    }

    fun setmImageUrl(mImageUrl: String?) {
        this.mImageUrl = mImageUrl
    }

    @Exclude
    fun getmKey(): String? {
        return mKey
    }

    @Exclude
    fun setmKey(Key: String?) {
        mKey = Key
    }

}

这是 DiffUtil.ItemCallback 的实现。

Diff Util 回调class

class PostDiffUtil : DiffUtil.ItemCallback<Upload>() {
    override fun areItemsTheSame(oldItem: Upload, newItem: Upload): Boolean = oldItem == newItem
    override fun areContentsTheSame(oldItem: Upload, newItem: Upload): Boolean =
        oldItem.toString() == newItem.toString()
}

上传数据class

data class Upload(
    var mImageUrl: String? = null,
    @Exclude @set:Exclude @get:Exclude
    var mKey: String? = null
)

适配器class。

class PostAdapter_Home : RecyclerView.Adapter<PostAdapter_Home.PostViewHolder>() {
    private val postDiffUtil = PostDiffUtil()
    val postListDiffer = AsyncListDiffer(this, postDiffUtil)
    override fun getItemCount(): Int = postListDiffer.currentList.size
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostViewHolder =
        PostViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.post_item_container_home_ex, parent, false))

    override fun onBindViewHolder(holder: PostViewHolder, position: Int) {
        holder.bindView(postListDiffer.currentList[position])
    }

    class PostViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val imageView: ShapeableImageView = itemView.findViewById(R.id.imagePostHome)
        fun bindView(upload: Upload) {
            val shimmer = ColorHighlightBuilder()
                .setBaseColor(Color.parseColor("#F3F3F3"))
                .setBaseAlpha(1f)
                .setHighlightColor(Color.parseColor("#E7E7E7"))
                .setHighlightAlpha(1f)
                .setDropoff(50f)
                .build()
            val shimmerDrawable = ShimmerDrawable()
            shimmerDrawable.setShimmer(shimmer)
            Glide.with(imageView.context)
                .load(upload?.getmImageUrl())
                .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
                .placeholder(shimmerDrawable)
                .fitCenter()
                .into(imageView)
        }
    }
}

更新列表。在 Activity 或片段中引用适配器,只需提交包含您的值的列表

val postAdapter = PostAdapter_Home()
postAdapter.postListDiffer.submitList(< Your List Here >)