我有RecyclerView
与LinearLayoutManager
方向HORIZONTAL
。其中的每个项目都可以具有交互元素(包括垂直ScrollView
s)。有没有一种方法可以轻松使RecyclerView
忽略用户尝试水平滚动或滑动RecyclerView
而不拦截对儿童的触摸事件?如何禁用滚动的RecyclerView除编程
我以编程方式控制RecyclerView
的滚动,它的工作效果很好,直到用户滑过它。
我已经尝试了一些非常简单的想法,当我调用smoothScrollToPosition来响应某些事件时,我启用滚动并禁用触摸事件,直到滚动结算。就像这样:
private class NoScrollHorizontalLayoutManager extends LinearLayoutManager {
ScrollingTouchInterceptor interceptor = new ScrollingTouchInterceptor();
protected boolean canScroll;
public NoScrollHorizontalLayoutManager(Context ctx) {
super(ctx, LinearLayoutManager.HORIZONTAL, false);
}
public RecyclerView.OnItemTouchListener getInterceptor() {
return interceptor;
}
@Override
public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
canScroll = true;
super.smoothScrollToPosition(recyclerView, state, position);
}
@Override
public void onScrollStateChanged(int state) {
super.onScrollStateChanged(state);
if(state == RecyclerView.SCROLL_STATE_IDLE) {
canScroll = false;
}
}
@Override
public boolean canScrollHorizontally() {
return canScroll;
}
public class ScrollingTouchInterceptor implements RecyclerView.OnItemTouchListener {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
return canScrollHorizontally();
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
}
而且使用这样的..
NoScrollHorizontalLayoutManager layout = new NoScrollHorizontalLayoutManager(context);
recycler.setLayoutManager(layout);
recycler.addOnItemTouchListener(layout.getInterceptor());
实际上几乎作品......但我仍然可以通过点击屏幕搞砸了编程滚动时平滑滚动正在运动。显然我错过了一些显而易见的事情,或者有一个更聪明的方法来做到这一点。
UPDATE非RecyclerView溶液这里找到: How do disable paging by swiping with finger in ViewPager but still be able to swipe programmatically?
/**
* ViewPager that doesn't allow swiping.
*/
public class NonSwipeableViewPager extends ViewPager {
public NonSwipeableViewPager(Context context) {
super(context);
}
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// Never allow swiping to switch between pages
return false;
}
}
我结束了刚刚使用旧式的ViewPager ...,完美的工作与更少的代码...哦,好吧。 – danb
没有明白你想要做什么。 –
发布代码,您如何处理它 –