2016-10-24 3 views
0

recyclerview에 스크롤 할 항목이 충분하면 FAB이 작동하지만 recyclerview가 스크롤되지 않는 경우 (항목 합계가 화면을 가리지 않음) 대소 문자를 처리해야합니다. 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; 
} 
} 

어떻게 처리 할이이 순간

나는 스크롤을 처리하는 방법?

답변

1

CoordinatorLayout과 별도로 다른 케이스를 처리해야합니다.

오버라이드 기능 layoutDependsOn :

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

onNestedScroll 또 다른 경우 처리해야 :

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

scrollListener이의 필드해야한다 : 같은

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

handleRecyclerViewScrolling이 보일 것을클래스. 또한 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