RecyclerView
, в отличие от ListView
, не имеет простого способа установить пустой вид на него, поэтому вам нужно управлять им вручную, делая видимым видимым вид в случае, когда количество элементов адаптера 0.Обнаружение анимации в Android RecyclerView
Реализация этого, сначала я попытался назвать пустой вид логики сразу после изменения нижележащих структуры (ArrayList
в моем случае), например:
btnRemoveFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
devices.remove(0); // remove item from ArrayList
adapter.notifyItemRemoved(0); // notify RecyclerView's adapter
updateEmptyView();
}
});
это делает вещь, но имеет недостаток: когда последний элемент удаляется, пустой вид появляется перед ani mation снят закончен, сразу после снят. Поэтому я решил подождать окончания анимации и обновить интерфейс.
К моему удивлению, я не смог найти хороший способ прослушать анимационные события в RecyclerView. Первое, что приходит на ум, это использовать isRunning
метод, как это:
btnRemoveFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
devices.remove(0); // remove item from ArrayList
adapter.notifyItemRemoved(0); // notify RecyclerView's adapter
recyclerView.getItemAnimator().isRunning(new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() {
@Override
public void onAnimationsFinished() {
updateEmptyView();
}
});
}
});
К сожалению, обратный вызов в этом случае запускается сразу, потому что в этот момент внутренний ItemAnimator
еще не находится в «бегущей» состоянии. Итак, вопросы: как правильно использовать метод ItemAnimator.isRunning() и есть ли лучший способ достичь желаемого результата, то есть показать пустой вид после удаления анимации одного элемента завершен?
Эй, римский. Вы когда-нибудь сталкивались с более централизованным решением этой проблемы? – Ryan
@ Ryan: К сожалению, нет. Но с момента моего ответа я не исследовал эту проблему. –