Мне нужно реализовать список изображений, как в 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: проблема не связана с нумерацией страниц, пробовал получить только первую страницу, с большим размером, но проблема осталась.