我正在尝试制作类似于 Instagram 过滤器布局的布局。基本上,当您选择一个过滤器时,它会滚动到您选择的项目 + 1,向您显示还有更多过滤器。
我目前正在尝试为我的水平 RecyclerView
构建自定义 LinearLayoutManager
:
public class LinearLayoutSnapManager extends LinearLayoutManager {
private int mCurrentPos = 0;
public LinearLayoutSnapManager(Context context) {
super(context);
}
public LinearLayoutSnapManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
public LinearLayoutSnapManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public void snap(RecyclerView rv, int position) {
if (mCurrentPos == position) {
// No move
return;
}
boolean goingRight = true;
if (position < mCurrentPos) {
goingRight = false;
}
mCurrentPos = position;
smoothScrollToPosition(rv, new RecyclerView.State(), goingRight ? getScrollRightPos(): getScrollLeftPos());
}
private int getScrollLeftPos() {
int newPos = mCurrentPos - 1;
return (newPos > 0) ? newPos : 0;
}
private int getScrollRightPos() {
return mCurrentPos + 1;
}
}
向左滚动按预期工作,但当我向右滚动时,它似乎只是跳到列表的末尾,而不是 newItem + 1,我不明白为什么会这样。
最佳答案
我在水平列表中的 onclicklistener
接口(interface)回调中调用我的 snap
方法。在调用界面之前,我正在设置所选项目,然后通知 View 已更改以更新当前状态。这导致布局管理器返回错误索引的所有问题。
我在创建一个空项目并测试我的逻辑后发现了这一点。令我惊讶的是工作正常,这让我能够找到真正的问题。
一旦我将 snaplogic 移动到我所有的 View 逻辑之前,一切都按预期工作,而我发布的代码没有任何变化。
希望这对以后的人有帮助。
关于android - LinearLayoutManager 平滑滚动跳转到错误位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332956/