RecyclerView: отключить прокрутку, если места достаточно для всех предметов - PullRequest
0 голосов
/ 28 января 2019

У меня огромный RecyclerView с GridLayoutManager.Иногда отображается небольшое количество элементов, и в этом случае мне нужно отключить прокрутку.Прокрутка должна быть включена только тогда, когда в RecyclerView слишком много элементов для показа, поэтому необходима прокрутка.

Почему? Потому что, когда пользователь нажимает достаточно быстро на элементах, щелчокслушатель не срабатывает.Пользователь случайно перемещает RecyclerView немного.Recycler's onTouchListener получает EVENT_MOVE и использует событие.

Я пытался создать собственный GridLayoutManager с переопределенным методом canScrollVertically():

override fun canScrollVertically(): Boolean {
    return super.canScrollVertically() && isScrollEnabled
}

Я использую эту функцию, чтобы проверить,RecyclerView можно прокручивать:

fun RecyclerView.isScrollableVertically(): Boolean {
    return computeVerticalScrollRange() > height
}

Затем я обновляю поле isScrollEnable:

val isScrollableVertically = items_list.isScrollableVertically()
(category_items_list.layoutManager as CustomGridLayoutManager).setScrollEnabled(isScrollableVertically)

Но даже когда есть много элементов, которые нужно показать, items_list.isScrollableVertically() возвращает false.


Я пытаюсь отключить прокрутку, когда достаточно места для всех предметов, но я не нашел подходящего способа сделать это в течение дня.Буду признателен за любую помощь!

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Следующий код работает для меня в Kotlin:

recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged( recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) // recyclerView.layoutManager!!.childCount) returns the number of visible items if (data.size <= recyclerView.layoutManager!!.childCount) recyclerView.stopScroll() } })

Это вызывается в Activity / Fragment, где вы устанавливаете адаптер для вашего recyclerView

EDITЯ обнаружил, что это условие работает в следующих ситуациях:

if (recyclerView.computeVerticalScrollRange() < recyclerView.height)

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

Попробуйте включить прокрутку, прежде чем проверять, прокручивается ли вид.Давайте посмотрим реализацию (java) метода computeVerticalScrollRange.

@Override
public int computeVerticalScrollRange() {
    if (mLayout == null) {
        return 0;
    }
    return mLayout.canScrollVertically() ? mLayout.computeVerticalScrollRange(mState) : 0;
}

После того, как вы отключите прокрутку, вы всегда получите нулевой диапазон прокрутки в вашем случае.Поэтому я думаю, что это должно помочь

// set 'isScrollEnabled' true    
(category_items_list.layoutManager as CustomGridLayoutManager).setScrollEnabled(true)

val isScrollableVertically = items_list.isScrollableVertically()
(category_items_list.layoutManager as CustomGridLayoutManager).setScrollEnabled(isScrollableVertically)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...