Gabe Sechan建议使用滚动状态更改是一个很好的建议.
不幸的是,没有滚动状态的监听器 – 它要求你继承RecyclerView.所以,我掀起了一个RecyclerViewEx来为该事件添加一个监听器API:
public class RecyclerViewEx extends RecyclerView {
interface OnScrollStateChangedListener {
void onScrollStateChanged(int state);
}
final private ArrayList 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
}
});
鉴于此,我不需要标志或任何其他状态,这有助于保持逻辑更简单.