Внешний 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 ответа
Комментарий Хэнка Муди на самом деле привел меня к правильному ответу - спасибо, Хэнк!
Вот как я решил свою проблему:
Создайте окно повторного просмотра "Прокрутка", в котором родитель получит все события прокрутки ребенка, выполнив следующее:
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; } }
Используйте это пользовательское представление 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.