ScrollingViewBehavior для ListView

У меня есть два действия с помощью AppBarLayout с Toolbar и TabLayout из библиотеки поддержки 22.

Макет обоих довольно похож: Toolbar наверху, под ней TabLayout , под ним ViewPager содержащий 3 Fragment .

Fragment первого действия имеет RecyclerView , второй Fragment использует ListView .

Прокручиваемый пример Toolbar из https://github.com/chrisbanes/cheesesquare отлично работает в первом действии с использованием RecyclerView , но с помощью ListView .

Я попытался создать пользовательский ListViewScrollBehavior который расширяет AppBarLayout.ScrollingViewBehavior , но пока не повезло. TouchEvent s передается в пользовательский класс только для горизонтальной прокрутки, но не при прокрутке ListView (по вертикали).

Любой способ использования CoordinatorLayout с ListView ?

Solutions Collecting From Web of "ScrollingViewBehavior для ListView"

Единственное решение, чтобы заставить его работать сейчас, это использовать это:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { listView.setNestedScrollingEnabled(true); } 

Очевидно, что он работает только на Lollipop.

Я считаю, что CoordinatorLayout работает только с RecyclerView и NestedScrollView . Попробуйте обернуть ListView в NestedScrollView или преобразовать его в RecyclerView с помощью LinearLayoutManager

Альтернативным решением для ответа Николаса ПОМЕПИ является использование ViewCompat.setNestedScrollingEnabled(View, boolean)

 ViewCompat.setNestedScrollingEnabled(listView, true); 

Конечно, вложенное поведение прокрутки будет работать только с Lollipop.

Для просмотра, способного реагировать на AppBarLayout, необходимо реализовать NestedScrollingChild. ListView – нет. Но он может быть легко реализован классом делегата. Используйте его, он будет делать то же, что и RecyclerView

 public class NestedScrollingListView extends ListView implements NestedScrollingChild { private NestedScrollingChildHelper mNestedScrollingChildHelper; public NestedScrollingListView(final Context context) { super(context); initHelper(); } public NestedScrollingListView(final Context context, final AttributeSet attrs) { super(context, attrs); initHelper(); } public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr) { super(context, attrs, defStyleAttr); initHelper(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public NestedScrollingListView(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); initHelper(); } private void initHelper() { mNestedScrollingChildHelper = new NestedScrollingChildHelper(this); setNestedScrollingEnabled(true); } @Override public void setNestedScrollingEnabled(final boolean enabled) { mNestedScrollingChildHelper.setNestedScrollingEnabled(enabled); } @Override public boolean isNestedScrollingEnabled() { return mNestedScrollingChildHelper.isNestedScrollingEnabled(); } @Override public boolean startNestedScroll(final int axes) { return mNestedScrollingChildHelper.startNestedScroll(axes); } @Override public void stopNestedScroll() { mNestedScrollingChildHelper.stopNestedScroll(); } @Override public boolean hasNestedScrollingParent() { return mNestedScrollingChildHelper.hasNestedScrollingParent(); } @Override public boolean dispatchNestedScroll(final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed, final int[] offsetInWindow) { return mNestedScrollingChildHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow); } @Override public boolean dispatchNestedPreScroll(final int dx, final int dy, final int[] consumed, final int[] offsetInWindow) { return mNestedScrollingChildHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow); } @Override public boolean dispatchNestedFling(final float velocityX, final float velocityY, final boolean consumed) { return mNestedScrollingChildHelper.dispatchNestedFling(velocityX, velocityY, consumed); } @Override public boolean dispatchNestedPreFling(final float velocityX, final float velocityY) { return mNestedScrollingChildHelper.dispatchNestedPreFling(velocityX, velocityY); } 

}