繁体   English   中英

带有图像的 Recycler View 滞后很多

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM