Мой адаптер правильно применяет изображения к 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, ему не нужно декодировать и показывать все изображения. Кроме того, он имеет механизм кэширования, чтобы сделать этот процесс более плавным.
build.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)
}
Отличный ответ, и я это очень ценю. Это сработало абсолютно идеально. Отличная работа!
Интересно, я попробую. Отчитаюсь; Благодарность!