Nested recyclerview scroll offsets

24 Views Asked by At

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()

1

There are 1 best solutions below

0
Adam Roberts On

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.