Странный эффект StaggeredGridLayoutManager при прокрутке списка

Мне нужно реализовать список изображений, как в pinterest (сетка с асимметричными рядами), и я использовал StaggeredGridLayoutManager таким образом в своем фрагменте:

Фрагмент сценария

scenarioAdapter = Adapter(mutableListOf()) {
            with(requireActivity() as MainActivity) {
                startImageActivity(it.imageLink, it.name)
            }
        }
        scenarioAdapter.clearList()
        val mLayoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL)
        mLayoutManager.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_NONE
        scenario_list.layoutManager = mLayoutManager
        scenario_list.adapter = scenarioAdapter

        scenarioViewModel.getScenario()

Поскольку этот список изображений разбит на страницы, в моем onViewCreated я вызываю этот метод:

private fun initScrollListener() {
        scenario_list.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                val layoutManager = recyclerView.layoutManager as StaggeredGridLayoutManager
                layoutManager.invalidateSpanAssignments()
                val lastVisibleItemPositions = intArrayOf(0,0)
                layoutManager.findLastVisibleItemPositions(lastVisibleItemPositions)
                if ((lastVisibleItemPositions[1] == scenarioAdapter.itemCount - 1) &&
                    scenarioAdapter.itemCount >= BuildConfig.PAGE_SIZE && keepScrolling && !alreadyRefreshed) {
                    alreadyRefreshed = true
                    scenarioViewModel.getScenario(scenarioAdapter.getPage())
                }
            }
        })
    }

и он отлично работает, он загружает изображения правильно.

Это адаптер

 class Adapter(
        private val items: MutableList<ScenarioModel>,
        private val click: (ScenarioModel) -> Unit
    ) :
        RecyclerView.Adapter<Adapter.ViewHolder>() {

        fun update(list: MutableList<ScenarioModel>) {
            this.items.addAll(list)
            notifyDataSetChanged()
        }

        fun clearList() = items.clear()

        fun getPage(): Int = (items.size / BuildConfig.PAGE_SIZE)

        override fun onCreateViewHolder(
            parent: ViewGroup,
            viewType: Int
        ): ViewHolder {
            val view =
                LayoutInflater.from(parent.context)
                    .inflate(R.layout.item_scenario_dynamic, parent, false)
            return ViewHolder(view)
        }

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.bindItem(items[position], click)
        }

        override fun getItemCount(): Int = items.size

        class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
            fun bindItem(item: ScenarioModel, click: (ScenarioModel) -> Unit) {
                GlideApp.with(itemView.context).load(item.imageLink).into(itemView.scenario_image)
                itemView.setOnClickListener { click(item) }
            }
        }
    }

Проблема в следующем: при отображении фрагмента у меня отображается 10 элементов. Когда я прокручиваю вниз, он работает отлично. Но когда я возвращаюсь назад, прокручивая вверх, элементы делают анимацию, например, если они переупорядочены или перезагружены, она меняется каждый раз. Кому я могу это исправить?

PS: проблема не связана с нумерацией страниц, пробовал получить только первую страницу, с большим размером, но проблема осталась.


person lucagiordano    schedule 06.04.2021    source источник
comment
Вы пробовали один из ответов здесь? stackoverflow.com/questions/27636999/   -  person Mayur Gajra    schedule 06.04.2021
comment
Я взглянул на это, но это решение сделано с учетом загружаемых изображений (они передаются адаптеру в массиве). В моем случае я загружаю их с помощью Glide, используя URL-адрес, поэтому у меня есть только строка, у меня нет свойств изображений.   -  person lucagiordano    schedule 07.04.2021