Recycler View с изображениями сильно отстает - PullRequest
0 голосов
/ 08 марта 2020

Я получаю данные из локальной базы данных внутри моего приложения. база данных имеет 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

}

, как вы можете видеть, я добавляю идентификатор ресурса изображения для моего объекта Poet. нет загрузки из inte rnet. все локально. вот мой код адаптера:

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, который, как я знаю, является дорогостоящим вызовом, и это делает задержку просмотра переработчиком. Даже если все локально, изображения, которые я получаю локально, довольно маленькие (около 150 Кбайт каждый), и я не называю R.id постоянно, он все еще сильно отстает при прокрутке. Так в чем здесь проблема?

1 Ответ

1 голос
/ 08 марта 2020

Размер jpeg в килобайтах мало связан с его размером в пикселях, поэтому 10 килобайт jpeg может легко составить 10_000 * 10_000 изображений, и ОС должна выделить соответствующее количество оперативной памяти для создания растрового изображения. Это дорого и требует времени. Кроме того, если вы выглядите как 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.

Чтобы преодолеть трудности, вы можете просто использовать библиотеку загрузки изображений, например Picasso

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...