我正在开发一款仅在一台设备上运行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();
}
}
答案 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) }
{}
它会正常工作