Внешний Recyclerview не получает события прокрутки внутреннего Recyclerview

Я следовал этому руководству, чтобы реализовать способы скрытия панели инструментов и FAB при прокрутке: https://mzgreen.github.io/2015/06/23/How-to-hideshow-Toolbar-when-list-is-scrolling(part3)/

Я вставил демонстрацию того, как поведение выглядит ниже.

прокрутка с потрясающим

Теперь вместо отдельных элементов в представлении реселлера на вкладках, содержащих только текстовое представление, я закодировал его так, чтобы он содержал изображение (ImageView), а под ним - представление рециркулятора, показывающее список элементов.

Следовательно, существует внешнее представление переработчика, которое содержит список внутренних представлений переработчика.

Внутреннее окно реселлера не прокручивается - я отключил его, следуя ответу в этой теме, переопределив метод canScrollVertically(): отключить прокрутку в дочернем андроиде Recyclerview. Я также попытался включить прокрутку для внутреннего просмотра переработчика, но у меня возникла та же проблема.

Внешний просмотр повторного использования прокручивается и имеет поведение, которое показывает / скрывает панель инструментов и FAB.

Когда я прокручиваю, удерживая изображение (ImageView), поведение приложения работает отлично, показывая и скрывая панель инструментов и FAB. Тем не менее, когда у меня есть палец на внутреннем представлении реселлера для прокрутки, внешний вид рециркулятора прокручивается и список перемещается вверх и вниз, но поведение отображения / скрытия панели инструментов и FAB никогда не активируется.

У меня такое ощущение, что это потому, что внутреннее представление переработчика перехватило прокрутку, а внешнее представление переработчика не получило событие прокрутки для активации поведения.

Кто-нибудь знает, как убедиться, что внешнее окно повторного использования также получает событие прокрутки, чтобы поведение работало?

3 ответа

Решение

Комментарий Хэнка Муди на самом деле привел меня к правильному ответу - спасибо, Хэнк!

Вот как я решил свою проблему:

  1. Создайте окно повторного просмотра "Прокрутка", в котором родитель получит все события прокрутки ребенка, выполнив следующее:

    public class ScrollThroughRecyclerView extends RecyclerView {
        public ScrollThroughRecyclerView(Context context) {
            super(context);
        }
    
        public ScrollThroughRecyclerView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ScrollThroughRecyclerView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }
    
        @Override
        public boolean dispatchTouchEvent(MotionEvent ev){
            //true - block scrolling of child and allow scrolling for parent recycler
            return true;
        }
    }
    
  2. Используйте это пользовательское представление recycler в своем xml или в своем java-коде, и события прокрутки будут правильно переданы вашему родительскому представлению recycler, которое активирует scroll behavior приложения.

Если вы хотите поместить один вертикальный переработчик в другой вертикальный, вы должны установить фиксированную высоту для представления дочернего переработчика или попробуйте перезаписать этот метод

@Override
public boolean dispatchTouchEvent(MotionEvent ev){
    //false - block scrolling of parent recycler and allow scrolling for child
    return false;
}

Вы пробовали использовать следующее в xml внутреннего переработчика?

app:layout_behavior="@string/appbar_scrolling_view_behavior"

РЕДАКТИРОВАТЬ: при условии, что вы используете CoordinatorLayout.

Другие вопросы по тегам