防止RecyclerView在触摸事件中停止滚动

3
我有一个简单的RecyclerView,使用字符串适配器显示数字列表,我希望在用户滚动并触摸RecyclerView时避免其停止滚动。 我已经取消了用户拖动时手动滚动RecyclerView,但我需要通过编程自己管理滚动(启动和停止滚动)。
我不想让用户与RecyclerView交互。 这里是一个小视频,展示了当用户触摸正在滚动的RecyclerView时会发生什么(它会停止)。我想取消这种行为。
这就是我如何取消用户拖动时的滚动。
recyclerViewSlot.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            // set return "true" = disables scrolling behaviour on dragging
            return true;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {
        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
        }
    });

通过添加这些代码行,行为没有任何变化。
recyclerViewSlot.setEnabled(false);
recyclerViewSlot.setClickable(false);
2个回答

1
你需要扩展RecyclerView类,然后手动防止onTouch被调用,如下所示:
public class YourRecyclerView extends RecyclerView {

    private boolean lock=false;
    public YourRecyclerView (Context context) {
        super(context);

    }

    public YourRecyclerView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public YourRecyclerView (Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);

    }


    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if(!lock){

        return super.onTouchEvent(ev);
        }
        else{
            return true;
        }

    }


    /**
     * @return the lock
     */
    public boolean isLock() {
        return lock;
    }

    /**
     * @param lock the lock to set
     */
    public void setLock(boolean lock) {
        this.lock = lock;
    }
}

谢谢Niza!我已经测试过了,得到了相同的结果。返回true或false对行为没有任何影响。你测试过吗? - gustav12
您可以使用该代码来防止用户滚动RecyclerView。如果您希望在RecyclerView被flinged时用户无法停止它,则需要检测recyclerView何时被flinged,然后将其锁定。 - Niza Siwale
请按如下方式添加滚动监听器:list.addOnScrollListener(new OnScrollListener(){ @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { // TODO Auto-generated method stub if(newState == AbsListView.OnScrollListener.SCROLL_STATE_FLING){ list.setLock(true); } else{ list.setLock(false); } } }); - Niza Siwale
相同的结果,我真的尝试了很多选项,但都没有成功。 - gustav12

1
在自定义的RecyclerView中重写onInterceptTouchEvent方法,您可以实现这一点。
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
    return false;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接