Ограничить пользовательскую прокрутку в RecyclerView - PullRequest
0 голосов
/ 27 января 2019

В моем проекте я использую RecyclerView, который я хочу прокручивать, вызывая метод startSmoothScroll () в LayoutManager:

private fun next(){
    val layoutManager = pager.layoutManager as BattlePageLayoutManager
    layoutManager.startSmoothScroll(smoothScroller(layoutManager.findFirstVisibleItemPosition() + 1))
    layoutManager.finishScroll()
}

Я не хочу, чтобы пользователь мог прокручивать вручную, e. г. проведением

Я уже пытался добиться этого путем переопределения метода onInterceptTouchEvent () родительского FrameLayout.

    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 пользователи могут самостоятельно прокручивать.

У вас есть другие идеи, чтобы подойти к этому?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Возможно, вы захотите заблокировать взаимодействие пользователя с RecyclerView, а не с самим FrameLayout.

Проверка RecyclerView.OnItemTouchListener .

В вашем RecyclerView, вы можете реализовать OnItemTouchListener и переопределить каждый метод, чтобы ничего не делать.

Это заблокирует взаимодействие пользователя с RecyclerView, и прокрутка не произойдет.

0 голосов
/ 27 января 2019

Вы пытались переопределить метод canScrollVertically () в LayoutManager?

mLayoutManager = new LinearLayoutManager(getActivity()) {
    @Override
    public boolean canScrollVertically() {
        return false;
    }
};

Edit: Создайте собственную реализацию RecyclerView, которая отключает сенсорное событие во время прокрутки. Затем вы должны изменить класс RecyclerView в xml-файле и Fragment / Activity вместе с ним.

Найдите здесь пример в Котлине

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)
    }
}

А на Яве

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...