Привет, я слышал об этой библиотеке DiffUtil, которая улучшает производительность представления ресайклера, и, следовательно, мое представление ресайклера содержит изображения, мне будет лучше реализовать его, но я не знаю, как

Примечание: я не включил код фрагмента, поэтому вопрос не будет длинным, но если вам нужно больше ссылок на код, скажите мне, я обновлю вопрос

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
    }

}
0
Vasant Raval 26 Ноя 2021 в 21:13

1 ответ

Лучший ответ

Это реализация DiffUtil.ItemCallback.

Класс обратного вызова Diff Util

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()
}

Загрузить класс данных

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

Класс адаптера.

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 >)
1
Eugene H 26 Ноя 2021 в 22:33
1
Большое спасибо, это работает как по волшебству
 – 
Vasant Raval
26 Ноя 2021 в 22:40
1
Вид ресайклера душный, большое вам спасибо
 – 
Vasant Raval
26 Ноя 2021 в 22:41
Привет, брат, я задал вопрос, связанный с разбиением на страницы stackoverflow.com/questions/70096562/… вы можете мне с этим помочь?
 – 
Vasant Raval
26 Ноя 2021 в 22:43
Буду признателен, если поможете мне с разбиением на страницы, я застрял на нем с последних 4 месяцев
 – 
Vasant Raval
26 Ноя 2021 в 22:43