gpt4 book ai didi

android - 我们如何区分 RecyclerView.OnScrollListener 中的用户滚动和 scrollToPosition() 滚动?

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:49 26 4
gpt4 key购买 nike

RecyclerView.OnScrollListeneronScrolled() 方法中,我需要能够区分滚动事件的两个不同来源:

  • 用户使用触摸事件滚动 RecyclerView
  • 代码滚动 RecyclerView 使用 scrollToPosition()

onScrolled() 没有似乎涵盖此内容的参数。是否有进行这种区分的秘诀?

FWIW,我的场景:我有两个 RecyclerView 小部件。一个是 master,显示一个传统的垂直列表。另一个用作 ViewPager 替代品,允许滑动浏览垂直列表中相同项目的详细信息。在大屏幕环境中,两个 RecyclerView 小部件将同时可见(主从模式),我需要使它们保持同步。如果用户滑动寻呼机 RecyclerView,我需要更改列表 RecyclerView 行上的指示器以匹配。如果用户点击列表 RecyclerView 中的一行,我需要更新寻呼机 RecyclerView 中的当前页面。为了监听寻呼机上的滑动事件,我使用了 OnScrollListener,但当滚动寻呼机以响应列表行点击时,它也会被触发。

最佳答案

Gabe Sechan 关于使用滚动状态更改的建议是一个很好的建议。

不幸的是,滚动状态没有监听器——它需要您子类化 RecyclerView。因此,我创建了一个 RecyclerViewEx 来为该事件添加一个监听器 API:

public class RecyclerViewEx extends RecyclerView {
interface OnScrollStateChangedListener {
void onScrollStateChanged(int state);
}

final private ArrayList<OnScrollStateChangedListener> listeners=new ArrayList<>();

public RecyclerViewEx(Context context) {
super(context);
}

public RecyclerViewEx(Context context, @Nullable
AttributeSet attrs) {
super(context, attrs);
}

public RecyclerViewEx(Context context, @Nullable AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}

public void addOnScrollStateChangedListener(OnScrollStateChangedListener listener) {
listeners.add(listener);
}

public void removeOnScrollStateChangedListener(OnScrollStateChangedListener listener) {
listeners.remove(listener);
}

@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);

for (OnScrollStateChangedListener listener : listeners) {
listener.onScrollStateChanged(state);
}
}
}

scrollToPosition() 不会触发滚动状态更改,而用户滑动会。因此,我可以通过这种方式区分这两种情况。

rve.addOnScrollStateChangedListener(
scrollState -> {
if (scrollState==RecyclerView.SCROLL_STATE_IDLE) {
// do something cool, now that the user swipe is complete
}
});

鉴于此,我不需要标志或任何其他状态,这有助于简化逻辑。

关于android - 我们如何区分 RecyclerView.OnScrollListener 中的用户滚动和 scrollToPosition() 滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48649695/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com