平滑滚动不适用于Android RecyclerView的初始滚动

时间:2016-12-08 04:35:00

标签: android android-recyclerview android-scroll linearlayoutmanager

我正在开发一款仅在一台设备上运行KitKat的Android应用程序。

我使用的RecylerView的平滑滚动功能正在其他物理平板电脑和genymotion工作,但遗憾的是,它停止了在需要处理的设备上工作。

而不是滚动到某个位置,它会越过目标位置并一直滚动到底部,看起来非常糟糕。

我能够将错误追溯到RecyclerView类中的抽象SmoothScroller。

           if (getChildPosition(mTargetView) == mTargetPosition) {
                onTargetFound(mTargetView, recyclerView.mState, mRecyclingAction);
                mRecyclingAction.runIfNecessary(recyclerView);
                stop();
            } else {
                Log.e(TAG, "Passed over target position while smooth scrolling.");
                mTargetView = null;
            }

我使用的是我在网上找到的SnappingLinearLayoutManager,但是用Android中的普通LinearLayoutManager换了它,但仍然遇到同样的问题。

列表长7项(用户一次可以看4个),我滚动到第5项(位置4)项。

当我滚动到第3个时,我没有收到此错误。

在我上下滚动列表一次之后,错误也停止了。

编辑: 我可以使用layoutManager.scrollToPositionWithOffset();但我试图通过平滑滚动动画来做到这一点。

以下是我的一些代码和详细信息:

private void setupMainRecyclerViewWithAdapter() {
    mainLayoutManager = new SnappingLinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
    mainListRecyclerView.setLayoutManager(mainLayoutManager);

    settingsMainListAdapter = new SettingsListAdapter(SettingsActivity.this,
            settingsPresenter.getSettingsItems(),
            settingsPresenter);

    mainListRecyclerView.setAdapter(settingsMainListAdapter);

    mainListRecyclerView.addItemDecoration(new BottomOffsetDecoration(EXTRA_VERTICAL_SCROLLING_SPACE));
}

@Override
public void scrollMainList(boolean listAtTop) {
    if(listAtTop) {
        mainListRecyclerView.smoothScrollToPosition(4);
        moveMainMoreButtonAboveList();
    } else {
        mainListRecyclerView.smoothScrollToPosition(0);
        moveMainMoreButtonBelowList();
    }
}

3 个答案:

答案 0 :(得分:2)

如果您调用recyclerView.smoothScrollToPosition(pos),则会在UI thread上立即调用,并且如果recyclerView的{​​{1}}太忙而无法生成视图项,则调用{{ 1}}将被遗漏,因为Adapter没有没有数据来平滑滚动。因此,最好在smoothScrollToPosition的后台线程中执行此操作。通过调用它,它进入recyclerView队列,并在其他待处理任务完成后执行。

因此,您应该执行以下操作以解决我的问题:

recyclerView.post()

答案 1 :(得分:1)

嗯,我意识到为时已晚,但是我尝试了一些不同的解决方案并找到了一个......

自定义LinearSmoothScroller中的

我覆盖updateActionForInterimTarget

@Override protected void updateActionForInterimTarget(Action action) { action.jumpTo(position); }

它看起来不是很平滑,但与scrollToPositionWithOffset形成鲜明对比。

答案 2 :(得分:1)

只需添加一行即可进行平滑滚动

Foo(std::vector<int> a, std::vector<int> b)
    : a{ std::move(a) },
      b{ std::move(b) }
{}

它会正常工作