Scroll lists to top atomatically
parent
8a64c88a07
commit
577cc848ee
@ -0,0 +1,40 @@
|
||||
package org.koitharu.kotatsu.core.ui.list
|
||||
|
||||
import androidx.recyclerview.widget.LinearLayoutManager
|
||||
import androidx.recyclerview.widget.RecyclerView
|
||||
import androidx.recyclerview.widget.RecyclerView.AdapterDataObserver
|
||||
|
||||
class RecyclerScrollKeeper(
|
||||
private val rv: RecyclerView,
|
||||
) : AdapterDataObserver() {
|
||||
|
||||
private val scrollUpRunnable = Runnable {
|
||||
(rv.layoutManager as? LinearLayoutManager)?.scrollToPositionWithOffset(0, 0)
|
||||
}
|
||||
|
||||
fun attach() {
|
||||
rv.adapter?.registerAdapterDataObserver(this)
|
||||
}
|
||||
|
||||
override fun onItemRangeInserted(positionStart: Int, itemCount: Int) {
|
||||
super.onItemRangeInserted(positionStart, itemCount)
|
||||
if (positionStart == 0 && isScrolledToTop()) {
|
||||
postScrollUp()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) {
|
||||
super.onItemRangeMoved(fromPosition, toPosition, itemCount)
|
||||
if (toPosition == 0 && isScrolledToTop()) {
|
||||
postScrollUp()
|
||||
}
|
||||
}
|
||||
|
||||
private fun postScrollUp() {
|
||||
rv.postDelayed(scrollUpRunnable, 500L)
|
||||
}
|
||||
|
||||
private fun isScrolledToTop(): Boolean {
|
||||
return (rv.layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() == 0
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue