首页 > 解决方案 > Viewholder 仅在滚动时绑定图像,而不是在初始加载时

问题描述

我有一个使用 Glide 加载的图像的 recyclerView,每个图像的大小都是以编程方式生成的:

fun bindCommunityImageOffer(model: CommunityOffer) {

        val requestListener = object : RequestListener<Drawable> {
            override fun onLoadFailed(e: GlideException?, imageModel: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {

                return false
            }

            override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean):Boolean{


                return false
            }
        }

        if (!model.mediaAspectRatio.isNullOrEmpty()) {


            val aspectRatioSplit = model.mediaAspectRatio.split(":")
            val widthRatio = Integer.parseInt(aspectRatioSplit[0])
            val heightRatio = Integer.parseInt(aspectRatioSplit[1])

            communityImageIv.scaleType = ImageView.ScaleType.FIT_XY


            if (widthRatio == heightRatio) {

                communityImageIv.layoutParams.height = communityImageIv.width
                communityImageCl.layoutParams.height = communityImageCl.width

            } else {

                communityImageIv.layoutParams.height = ((communityImageIv.width.toFloat() / widthRatio.toFloat()) * heightRatio).toInt()
                communityImageCl.layoutParams.height = ((communityImageCl.width.toFloat() / widthRatio.toFloat()) * heightRatio).toInt()


            }


        } else {

            communityImageIv.scaleType = ImageView.ScaleType.CENTER_CROP
            val widthRatio = 25
            val heightRatio = 21
            communityImageIv.layoutParams.height = ((communityImageIv.width.toFloat() / widthRatio.toFloat()) * heightRatio).toInt()
            communityImageCl.layoutParams.height = ((communityImageCl.width.toFloat() / widthRatio.toFloat()) * heightRatio).toInt()

        }

        itemView.communityImageCl.requestLayout()
        itemView.communityImageIv.requestLayout()


        Glide.with(itemView.context).load(model.coverUrl).into(communityImageIv)


        }
        }

Activity 中的 RecyclerView:

private val adapter = FeedAdapter()

    private lateinit var emptyView: View
    private lateinit var progressBar: TintedProgressBar
    private lateinit var recyclerView: PlayerViewContainer
    private lateinit var refresher: SwipeRefreshLayout

    private var legacyOffers: MutableList<FeedItem>? = null
    private var offers: List<WatchAndRespondOffer>? = null
    private var communityOffers: List<CommunityOffer>? = null

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.f_sponsor_hub_my_offers, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        emptyView = view.find(R.id.empty_view)
        progressBar = view.find(R.id.progress_indicator)
        recyclerView = view.find(R.id.recycler_view)
        refresher = view.find(R.id.my_offers_refresher)

        val layoutManager = LinearLayoutManager(activity)
        recyclerView.layoutManager = layoutManager
        recyclerView.addItemDecoration(OffsetItemDecoration(dip(30), dip(16)))
        recyclerView.setPlayerInitializer {
            PlaybackInfo(INDEX_UNSET, TIME_UNSET, VolumeInfo(true, 0.75f))
        }
        recyclerView.adapter = adapter
        refresher.setOnRefreshListener { refresh() }


    }

// API 调用后在适配器上调用,将所有检索到的项目添加到 RecyclerView

fun clearAndAddAll(data: Collection<Any>) { 


    items.clear()
    items.addAll(data)

    notifyDataSetChanged()

}

第一次加载列表时图像不会出现,但是当视图滚动时,新图像会出现。当我滚动回列表顶部时,应该立即出现的图像也会被加载。我觉得我在做一些不正常的事情,但我不确定是什么。

标签: androidandroid-recyclerviewandroid-glide

解决方案


推荐阅读