首先, 我们给 外部的 recyclerView 命名为 outer, 内部的 recyclerView 命名为 inner
问题是这样的: 布局是 outer 的一个 item 是 inner, inner 横向可滑动的, 上下滑动后, 回到 inner 位置, 发现 inner 又回到了初始位置, 如下图:
直接给结论:
1. inner 在 outer onBind 时, 不要重复设置 layoutManager, 如果非必要也不要让 adapter 刷新, recyclerView 有自己的回收复用机制, inner 会正常保留滑动的位置.
2. 如果 inner 滑动回来时需要更新 adapter, 可以使用 inner.post, 在 post 中更新 adapter 数据, 这样 inner 仍会保留之前的位置.
正确代码示例:
上图可见, inner 的 adapte 只会在 outer 的 viewholder(LiveAttentionBannerVH) 中初始化一次, 在执行 onBindBanner 时, inner 也只会设置一次 adapter.
因为本人菜鸡, 不会看源码, 所以只能猜测一下...
原因猜想:
1. 重新设置 layoutManager 会重新布局, recyclerView 就回到了初始位置.
2. 滑动后让 inner 重新展示时, inner 首先会让 itemView 执行 attach, 此时让 adapter 刷新数据, 因为 view 还没有重新排列好, adapter 刷新就会覆盖掉之前的位置, 导致位置无法记录, post 有效原因也在于此, 因为会在下一个消息循环中刷新, view 就保留在上次的位置进行刷新数据了.
以上纯属猜想, 又遇到问题的小伙伴可以先试着解决下.
后续会努力看下 recyclerView 的源码, 在开发中实在是了解其真正的原理实在太重要了, 最近在 recyclerView 上踩了不少坑... o(╥﹏╥)o