網上給出的方法大緻為一下四種,擇優食用
1. 自定義一個 behavior
public class FlingBehavior extends AppBarLayout.Behavior {
private static final int TOP_CHILD_FLING_THRESHOLD = 3;
private boolean isPositive;
public FlingBehavior() {
}
public FlingBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
velocityY = velocityY * -1;
}
if (target instanceof RecyclerView && velocityY < 0) {
final RecyclerView recyclerView = (RecyclerView) target;
final View firstChild = recyclerView.getChildAt(0);
final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
}
return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
}
@Override
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
isPositive = dy > 0;
}
}
2. 監聽 RecyclerView 滑動,設定 AppBarLayout 在清單第一個直接展開
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
int visiblePosition = linearLayoutManager.findFirstCompletelyVisibleItemPosition() ;
if (visiblePosition == 0 && appBarLayout != null) {
appBarLayout.setExpanded(true, true) ;
}
}
}
3. 使用第三方庫
compile "me.henrytao:smooth-app-bar-layout:."
4. 更新到 support:26.0.0 及以上
谷歌說在 support 26 以上已經解決了改問題,但是我這裡沒去測試,就不好下結論了,可以嘗試。
compile 'com.android.support:design:26.0.0'
缺點分析
方法1:在滑動清單時偶爾會出現 AppBarLayout 全部展開後,清單資料從 AppBarLayout 中拉出。
方法2:當滑動到頂部會直接展開 AppBarLayout ,效果有點突兀(目前項目上用的就是這個...)改為更新 support:design:26.1.0
方法3:當下方是一個 ViewPager 時貌似不支援(大概是因為我菜吧 ,效果沒實作出來)
方法4:沒去測試,因為手頭項目用的是 25.3.1 的 support 包,暫時不想替換,萬一出現什麼幺蛾子還得填坑!
2018-5-17 更新
最終解決辦法還是更新到compile 'com.android.support:design:26.1.0'
更新過程可能出現 Error:Failed to resolve: com.android.support:support-v4:26.1.0) 的問題,解決辦法是:參考 stackoverflow 上的高票答案
還有可能出現 Error:SSL peer shut down incorrectly報錯, 解決辦法是
1. 參考 stackoverflow 上的高票答案
2. clean project ( 筆者采用這個方法成功 )
參考
本文同步分享在 部落格“_龍衣”(CSDN)。
如有侵權,請聯系 [email protected] 删除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。