Android -потрясающее поведение с половиной списка

#android #floating-action-button #android-nestedscrollview

#Android #плавающая кнопка действия #android-вложенный scrollview

Вопрос:

У меня работает FAB, когда в recyclerview достаточно элементов для прокрутки, но мне нужно обработать случай, когда recyclerview не прокручивается (общее количество элементов не покрывает экран).

На данный момент именно так я обрабатываю прокрутку:

 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.

переопределить функцию layoutDependsOn :

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

onNestedScroll также следует обработать другой случай:

 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 должно быть поле в вашем FABBehavior классе. Также объявляйте внутренний класс внутри 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, когда он прокручивается, и показывает его, когда он находится в состоянии ожидания.

Комментарии:

1. Я сделал некоторую адаптацию, поскольку она работала не так, как я ожидал, но в целом это сработало! Хорошее решение.