![](/img/trans.png)
[英]Android: Images in recycler view item shuffle a lot on scrolling fast
[英]Recycler View with images lags a lot
我正在从我的应用程序内的本地数据库中获取数据。 数据库有 43 行,所以它不是一个很长的列表。 这是我的代码中获取数据的部分:
fun readAllPoets(): ArrayList<Poet> {
val poetList: ArrayList<Poet> = arrayListOf<Poet>()
val db = readableDatabase
val stringQuery = "SELECT * FROM info"
val cursor: Cursor = db.rawQuery(stringQuery,null)
var poetid: String
var faname: String
var enname: String
while (cursor.moveToNext()) {
poetid = cursor.getString(cursor.getColumnIndex(DBPoet.UserEntry.COLUMN_POET_ID))
faname = cursor.getString(cursor.getColumnIndex(DBPoet.UserEntry.COLUMN_FANAME))
enname = cursor.getString(cursor.getColumnIndex(DBPoet.UserEntry.COLUMN_ENNAME))
poetList.add(Poet(poetid, faname, enname))
}
cursor.close()
return poetList
}
然后在 MainActivity 我调用这个函数:
private fun fetchPoets() {
poetList = DBHelper.UsersDBHelper(this).readAllPoets()
rvPoetList.layoutManager = LinearLayoutManager(this)
poetList.forEach {
it.imageId = this.baseContext.resIdByName(it.enName.toLowerCase(),"drawable")
}
val adapter = PoetListAdapter()
adapter.setData(poetList)
rvPoetList.adapter = adapter
}
如您所见,我正在将图片资源 ID 添加到我的 Poet 对象。 没有从互联网下载。 一切都是本地的。 这是我的适配器代码:
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(poet: Poet) {
itemView.poet_title.setText(poet.faName)
itemView.img_poet.setImageResource(poet.imageId)
}
}
fun setData(poets: List<Poet>) {
this.poets = poets
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.single_poet_view, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
poets?.get(position)?.let { poet ->
holder.bind(poet)
}
holder.itemView.setOnClickListener { v ->
listener?.onItemClickListener(v, holder.layoutPosition)
}
}
正如你所看到的,我并没有经常调用 R.id,我知道这是一个代价高昂的调用,它使回收者视图滞后。 即使一切都是本地的,我在本地获取的图像相当小(每个大约 150kb)而且我没有经常调用 R.id,滚动时它仍然很滞后。 那么这里的问题是什么?
以 kb 为单位的 jpeg 大小与其以像素为单位的大小几乎没有联系,因此 10 kb jpeg 很容易成为 10_000*10_000 图像,操作系统必须分配适当数量的 ram 来创建位图。 这是昂贵的并且需要时间。 此外,如果您查看ImageView::setImageResource文档,您可以看到一条注释This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider using setImageDrawable(android.graphics.drawable.Drawable) or setImageBitmap(android.graphics.Bitmap) and BitmapFactory instead.
This does Bitmap reading and decoding on the UI thread, which can cause a latency hiccup. If that's a concern, consider using setImageDrawable(android.graphics.drawable.Drawable) or setImageBitmap(android.graphics.Bitmap) and BitmapFactory instead.
为了克服麻烦,您可以简单地使用图像加载库,例如毕加索
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.