Котлин: Recycler View Choppy - PullRequest
       3

Котлин: Recycler View Choppy

0 голосов
/ 07 ноября 2018

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

1 Ответ

0 голосов
/ 07 ноября 2018

Я думаю, что проблема заключается в декодировании растрового изображения в основном потоке. Попробуйте вместо этого использовать 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...