android - 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()
}
第一次加载列表时图像不会出现,但是当视图滚动时,新图像会出现。当我滚动回列表顶部时,应该立即出现的图像也会被加载。我觉得我在做一些不正常的事情,但我不确定是什么。
解决方案
推荐阅读
- c# - 在 C# 中使用丢弃运算符“_”是否会以任何方式优化代码?
- json - Excel VBA REST API 连接 POST json 语法错误
- java - 如何在 restTemplate.exchange 期间从字符串返回特定对象?
- java - 从可绘制菜单中打开一个新活动
- android-studio - 切换ListView的适配器后,选择了错误的索引(“灰显”)Kotlin
- java - 表没有保存到我的解析服务器上?
- powershell - 使用 Plink 将 .NET 构建文件夹的内容复制到 Ubuntu 服务器
- pandas - 我希望这个函数只产生一个答案,但由于某种原因它提供了一个完整的列表。我怎样才能让它产生一个答案?
- python - Kaggle 笔记本无法读取数据集
- javascript - 重构使用同一文件中的函数进行测试的函数的正确方法