RecyclerView
, в отличие от ListView
, не имеет простого способа установить для него пустое представление, поэтому нужно вручную управлять им, делая видимым пустое представление в случае, если количество элементов адаптера равно 0.
Внедряя это, сначала я попытался вызвать пустую логику вида сразу после изменения структуры подкласса (ArrayList
в моем случае), например:
btnRemoveFirst.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
devices.remove(0); // remove item from ArrayList
adapter.notifyItemRemoved(0); // notify RecyclerView adapter
updateEmptyView();
}
});
Он делает то же самое, но имеет недостаток: когда последний элемент удаляется, перед просмотром появляется пустой вид , после чего удаляется. Поэтому я решил подождать окончания анимации и обновить интерфейс.
К моему удивлению, я не смог найти хороший способ прослушать анимационные события в 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 adapter
recyclerView.getItemAnimator().isRunning(new RecyclerView.ItemAnimator.ItemAnimatorFinishedListener() {
@Override
public void onAnimationsFinished() {
updateEmptyView();
}
});
}
});
К сожалению, обратный вызов в этом случае выполняется немедленно, потому что в этот момент внутренний ItemAnimator
все еще не находится в состоянии "running". Итак, вопросы: как правильно использовать метод ItemAnimator.isRunning() и есть лучший способ добиться желаемого результата, т.е. показать пустой вид после удаления анимации одного элемента закончил