I have vertical recyclerview, next to a horizontal recyclerview with nested vertical recyclerviews. (That first vertical may not be germane.) I have them all set to scroll at the same offset with this class.
class RecyclerViewSyncHelper() {
private var absoluteOffset: Int = 0
private val verticalRecyclerViews = mutableListOf<RecyclerView>()
fun getAbsoluteOffset(): Int? { return absoluteOffset }
fun addVerticalRecyclerView(recyclerView: RecyclerView) {
recyclerView.clearOnScrollListeners()
recyclerView.addOnScrollListener(onScroll)
verticalRecyclerViews.add(recyclerView)
matchOffset(verticalRecyclerViews[0].computeVerticalScrollOffset())
}
fun removeVerticalRecyclerView(recyclerView: RecyclerView) {
verticalRecyclerViews.remove(recyclerView)
}
var onScroll = object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val value = recyclerView.computeVerticalScrollOffset()
if(value != 0) matchOffset(value)
}
}
fun matchOffset(offset: Int? = absoluteOffset) {
offset?.let { offsetValue ->
verticalRecyclerViews.forEach { recyclerView ->
val currentOffset = recyclerView.computeVerticalScrollOffset()
if (offsetValue != currentOffset) {
recyclerView.scrollBy(0, offsetValue-currentOffset)
}
}
}
}
}
So now it all scrolls at the same speed. COOL! BUT!!!! Once a new nested vertical recyclerview is populated it's offset is 0 until it is fully on the screen.
I have tried holder.detailsRecyclerView.scrollBy(0, 0-recyclerViewSyncHelper.getVerticalRecyclerViews()[0].computeVerticalScrollOffset()) inside my onCreateViewHolder and onBind. Still no go.`class RecyclerViewSyncHelper() { private var absoluteOffset: Int = 0 private val verticalRecyclerViews = mutableListOf()
For what it's worth, I had to set the offset to an offset I KNEW was set in the onBindViewHolder. Knowing that the first one was the one I always wanted it set to I added
myLayoutManager.scrollToPositionWithOffset(0,-1*recyclerViewSyncHelper.getVerticalRecyclerViews()[0].computeVerticalScrollOffset())Before adding it to the list of recyclerviews. In case this helps anyone in the future.