在我的项目中,我使用一个RecyclerView,我只想通过调用LayoutManager的startSmoothScroll()方法进行滚动:
private fun next(){
val layoutManager = pager.layoutManager as BattlePageLayoutManager
layoutManager.startSmoothScroll(smoothScroller(layoutManager.findFirstVisibleItemPosition() + 1))
layoutManager.finishScroll()
}
我不希望用户能够手动滚动,例如. G.通过刷卡.
我已经尝试通过重写父FrameLayout的onInterceptTouchEvent()方法来实现这一点.
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
if (ev.actionMasked == MotionEvent.ACTION_DOWN){
startClickTime = System.currentTimeMillis()
startX = ev.x
startY = ev.y
}
val allowEvent = (System.currentTimeMillis() - startClickTime) < 1000 && (startX-ev.x).absoluteValue < 15 && (startY-ev.y).absoluteValue < 15
return !allowEvent
}
基本上可以正常工作,但是发生了两次双击View用户便可以自己滚动的情况.
您还有其他想法可以解决吗?
最佳答案
您是否尝试在LayoutManager中覆盖canScrollVertically()方法?
mLayoutManager = new LinearLayoutManager(getActivity()) {
@Override
public boolean canScrollVertically() {
return false;
}
};
编辑:
创建您自己的RecyclerView实现,该实现在滚动执行时禁用触摸事件.然后,您必须更改xml文件中的RecyclerView类,并使用它来更改Fragment / Activity.
在这里找到Kotlin的示例
class MyRecyclerView : RecyclerView {
constructor(context: Context) : super(context) {}
constructor(context: Context,attrs: AttributeSet?) : super(context,attrs) {}
constructor(context: Context,attrs: AttributeSet?,defStyle: Int) : super(context,attrs,defStyle) {}
override fun onInterceptTouchEvent(e: MotionEvent): Boolean {
return if (scrollState != RecyclerView.SCROLL_STATE_IDLE) false else super.onInterceptTouchEvent(e)
}
}
而在Java中
public class MyRecyclerView extends RecyclerView {
public MyRecyclerView(Context context) {
super(context);
}
public MyRecyclerView(Context context,@Nullable AttributeSet attrs) {
super(context,attrs);
}
public MyRecyclerView(Context context,@Nullable AttributeSet attrs,int defStyle) {
super(context,defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
if(getScrollState() != SCROLL_STATE_IDLE)
return false;
return super.onInterceptTouchEvent(e);
}
}