2016-10-24 11 views
0

recyclerviewにはスクロールするのに十分な項目がある場合はFABが働いていますが、recyclerviewがスクロールしない場合(項目の合計が画面を覆わない)のケースを処理する必要があります。Android -FAB半分のリストでの動作

現時点ではこれは私がスクロールを処理する方法である:

public class FABBehavior extends FloatingActionButton.Behavior { 

public FABBehavior() { 
    super(); 
} 

public FABBehavior(final Context context, final AttributeSet attrs) { 
    super(context, attrs); 
} 

@Override 
public void onNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, final View target, final int dxConsumed, final int dyConsumed, final int dxUnconsumed, final int dyUnconsumed) { 
    super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed); 

    if (dyConsumed > 0) { 
     CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); 
     int fab_bottomMargin = layoutParams.bottomMargin; 
     child.animate().translationY(child.getHeight() + fab_bottomMargin).setInterpolator(new LinearInterpolator()).start(); 
    } else if (dyConsumed < 0) { 
     child.animate().translationY(0).setInterpolator(new LinearInterpolator()).start(); 
    } 
} 

@Override 
public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child, final View directTargetChild, final View target, final int nestedScrollAxes) { 
    return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; 
} 
} 

recyclerviewは、いくつかの項目がある場合に対処するためにどのように?

答えて

1

CoordinatorLayoutとは別に、別のケースを処理する必要があります。

if (target instanceof RecyclerView) { 
    handleRecyclerViewScrolling(target, child); 
    return; 
} 

handleRecyclerViewScrolling次のようになります:

private void handleRecyclerViewScrolling(View target, FloatingActionButton child) { 
    if (scrollListener != null) { 
     return; 
    } 
    RecyclerView recyclerView = (RecyclerView) target; 
    scrollListener = new RecyclerViewScrollListener(child); 
    recyclerView.addOnScrollListener(scrollListener); 
} 

scrollListenerすると、あなたののフィールドでなければなりません

@Override 
public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { 
    return super.layoutDependsOn(parent, child, dependency) || dependency instanceof RecyclerView; 
} 

onNestedScrollまた別のケースを処理する必要があります。function layoutDependsOn

オーバーライドクラス。またFABBehavior内部内部クラスを宣言する:

private class RecyclerViewScrollListener extends RecyclerView.OnScrollListener { 
    FloatingActionButton mChild; 

    public RecyclerViewScrollListener(FloatingActionButton child) { 
     this.mChild = child; 
    } 

    @Override 
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
     super.onScrollStateChanged(recyclerView, newState); 
     if (newState == RecyclerView.SCROLL_STATE_IDLE) { 
      mChild.show(); 
     } else { 
      mChild.hide(); 
     } 
    } 

    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     if (!recyclerView.canScrollVertically(Integer.MAX_VALUE)) { 
      mChild.show(); 
     } 
    } 
} 
RecyclerViewScrollListener

は、スクロールされたときに、FAB隠し、それがアイドル状態にあるときにそれを示します。

+0

私は期待どおりに動作していなかったので、私はいくつかの修正を行いましたが、一般的にはトリックでした!良い解決策。 – Bugdr0id

関連する問題