天天看點

android coordinatorlayout滑動卡頓,Android AppBarLayout + RecyclerView 下滑到第一條卡頓解決之道...

網上給出的方法大緻為一下四種,擇優食用

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源創計劃”,歡迎正在閱讀的你也加入,一起分享。