在我的项目中,我使用一个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用户便可以自己滚动的情况。
您还有其他想法可以解决吗?
答案 0 :(得分:2)
您是否尝试在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, attrs, defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
if(getScrollState() != SCROLL_STATE_IDLE)
return false;
return super.onInterceptTouchEvent(e);
}
}
答案 1 :(得分:0)
您可能想阻止用户与RecyclerView
进行交互,而不是FrameLayout
本身。
选中RecyclerView.OnItemTouchListener。
在您的RecyclerView
中,您可以实现OnItemTouchListener
并覆盖所有方法以执行任何操作。
这将阻止用户与RecyclerView
进行交互,从而使滚动不会发生。