水平RecyclerView作为垂直RecyclerView中的项目放置时自动滚动问题

HBB*_*B20 7 android android-layout android-support-library android-recyclerview

为了复制这个问题,我克隆了一个现有的项目并添加了两个片段.所以现在有Activity一个ViewPager有2个片段.每个Fragment都有一个RecyclerView(垂直),其中包含多个RecyclerView(水平)项.

现在问题是当中RecyclerView点水平RecyclerView位于顶部时,切换选项卡上的垂直自动滚动.

例如:

  1. 第1页滚动到此位置

(请注意,第一个H-Recycler视图设置为仅一半可见)

  1. 然后点击tablayout上的第2页,转到第2页.

  2. 现在再次点击tablayout上的第1页返回页面1.这里预期的滚动位置是我们之前离开的位置,但它会自动滚动到顶部位置.像这样

(首先RecyclerView是完全可见而不是一半.)


在找出解决方案时,我得到了一些线索.

  • v24.1.1和v24.2.1的库(在编写本文时最新)会出现此问题,但是当它降级到v23.4.0时,它会按预期工作.很明显,库中的某些东西被修改导致了这种行为.
  • 与包含webview的项目遇到相同的问题.webView和H-recyclerView之间的共同点是两者都可以在内部水平滚动.问题可能与滚动事件的消耗有关.

Rea*_*hed 0

Fragment切换时可以保存滚动状态ViewPagerstatic让我们在你的变量中有一个变量Activity来存储滚动状态,如下所示

public static int scrollPositionIndex;
public static int scrollPositionOffset;
Run Code Online (Sandbox Code Playgroud)

现在从您的Fragment,覆盖该setUserVisibleHint函数。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    // Make sure that we are currently visible
    if (this.isVisible()) {
        // If we are becoming invisible, then...
        if (!isVisibleToUser) {

            // Save scroll state
            LinearLayoutManager layoutManager = ((LinearLayoutManager) mRecyclerView.getLayoutManager());
            YourActivity.scrollPositionIndex = layoutManager.findFirstVisibleItemPosition();

            View v = mRecyclerView.getChildAt(0);
            YourActivity.scrollPositionOffset = (v == null) ? 0 : (v.getTop() - mRecyclerView.getPaddingTop());

        } else {
            // Scroll to the saved position
            mLayoutManager.scrollToPositionWithOffset(YourActivity.scrollPositionIndex,
                    YourActivity.scrollPositionOffset);

            // Reset the value
            YourActivity.scrollPositionIndex = 0;
            YourActivity.scrollPositionOffset = 0;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)