android - Kotlin: Recycler View Choppy
问题描述
我的适配器正确地将图像应用到 RecyclerView 并正确滚动......直到我添加大量项目。然后它变得相当不稳定,我知道这是我的方法的问题。请看下面的代码:
class FragmentMenuViewAdapter(private val menuItems: ArrayList<MenuItemModel>, private val clickListener: (MenuItemModel) -> Unit) : RecyclerView.Adapter<FragmentMenuViewAdapter.CustomViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
val policy = StrictMode.ThreadPolicy.Builder().permitAll().build()
StrictMode.setThreadPolicy(policy)
val layoutInflater = LayoutInflater.from(parent.context)
val cellForRow = layoutInflater.inflate(R.layout.recyclerview_list_items, parent, false)
return CustomViewHolder(cellForRow)
}
override fun getItemCount(): Int {
return menuItems.size
}
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
var menuItemIconURI = RouteManager.mAppModel?.resourcesURL + menuItems[position].icon
menuItemIconURI = menuItemIconURI.replace("\$platform", "iOS")
menuItemIconURI = menuItemIconURI.replace("\$scale", "@3x")
val inputStream = URL(menuItemIconURI).openStream()
holder.view.menuButton.setImageBitmap(BitmapFactory.decodeStream(inputStream))
holder.bind(menuItems[position], clickListener)
}
class CustomViewHolder(val view: View): RecyclerView.ViewHolder(view) {
fun bind(menuItem: MenuItemModel, clickListener: (MenuItemModel) -> Unit) {
view.setOnClickListener{clickListener(menuItem)}
}
}
}
图片是通过 URL 链接设置的。我有它的工作,但我怀疑我在某个地方犯了一个新手错误,或者只是采取了错误的方法。任何有关如何调整我的代码的建议将不胜感激。
解决方案
我认为问题出在主线程中解码位图图像。尝试Glide
改用。它可以帮助我们在需要时异步加载图像。例如,如果你想RecyclerView
快速滚动,它不需要解码和显示所有图像。此外,它有一个缓存机制,使这个过程更顺畅。
构建.gradle
dependencies {
implementation 'com.github.bumptech.glide:glide:4.7.1'
}
FragmentMenuViewAdapter.kt
override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
var menuItemIconURI = RouteManager.mAppModel?.resourcesURL + menuItems[position].icon
menuItemIconURI = menuItemIconURI.replace("\$platform", "iOS")
menuItemIconURI = menuItemIconURI.replace("\$scale", "@3x")
Glide.with(holder.view.menuButton.context)
.load(menuItemIconURI)
.into(holder.view.menuButton)
holder.bind(menuItems[position], clickListener)
}
推荐阅读
- java - 如何使用 JPA 命名查询在查询参数中设置类似值
- amazon-web-services - AWS SNS 主题未能将完整数据发送到订阅的 AWS lambda
- r - R中的交叉分析。将数据框简化为跨特征组合的总和
- c - 附加到链表时进行了不必要的更改
- git - 如何在 Jenkins 的 url 中传递 credentialID
- json - 从 json 文件导入 Azure Devops 管道变量
- javascript - 基于页面滚动动态更改文本颜色(作为线性渐变)
- java - 带有图表内容的 Apache POI 问题克隆表
- excel - 从列表框中选择时 Excel VBA 程序崩溃
- amazon-cloudformation - CloudFormation 模板完成后如何发送通知