用于ListView的ScrollingViewBehavior

我有两个使用AppBarLayout与支持库22中的ToolbarTabLayout活动。

两者的布局非常相似:顶部有一个Toolbar在其下方是TabLayout ,在其下面是一个包含3个FragmentViewPager

第一个活动的Fragment有一个RecyclerView ,第二个活动的Fragment使用ListView来代替。

https://github.com/chrisbanes/cheesesquare中的可滚动Toolbar示例在使用RecyclerView的第一个活动上正常工作,但在ListView上工作正常。

我试过创build了一个扩展AppBarLayout.ScrollingViewBehavior的自定义ListViewScrollBehavior ,但到目前为止没有运气。 TouchEvent仅传递给自定义类进行水平滚动,而不是滚动ListView (垂直方向)。

任何方式与ListView使用CoordinatorLayout

Solutions Collecting From Web of "用于ListView的ScrollingViewBehavior"

使它现在工作的唯一解决scheme是使用这个:

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

显然只能在棒棒糖上工作。

Nicolas POMEPUY的替代解决scheme的答案是使用ViewCompat.setNestedScrollingEnabled(View, boolean)

 ViewCompat.setNestedScrollingEnabled(listView, true); 

当然,嵌套的滚动行为只能从棒棒糖中工作。

我相信CoordinatorLayout只能用于RecyclerViewNestedScrollView 。 尝试将您的ListView包装在NestedScrollView或使用LinearLayoutManager将其转换为RecyclerView

为了能够在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); } 

}

ListView ScrollingViewBehavior仅支持> = 21。

否则,您应该按照以下方式编写代码:

 private int mPreviousVisibleItem; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { listView.setNestedScrollingEnabled(true); } else { listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if (firstVisibleItem > mPreviousVisibleItem) { appBarLayout.setExpanded(false, true); } else if (firstVisibleItem < mPreviousVisibleItem) { appBarLayout.setExpanded(true, true); } mPreviousVisibleItem = firstVisibleItem; } }); }