RecyclerView与ListView不同,没有一种简单的方式来设置一个空的视图,所以人们必须手动管理它,使空的视图可见,以防适配器的项目数为0。
实现这一点,起初我试图在修改底层结构(我的case中的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();
}
});
它做的事情,但有一个缺点:当最后一个元素被删除时,删除动画完成之前立即出现空视图。所以我决定等到动画结束,然后更新UI。
令我惊讶的是,我无法找到一个好的方式来听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()方法,并且有更好的方法来实现所需的结果,即在单个元素删除动画结束后显示空视图?