当前位置: 首页 > 知识库问答 >
问题:

在Android的RecyclerView中检测动画完成

范承志
2023-03-14

listview不同,recyclerview没有简单的方法来设置空视图,因此必须手动管理它,在适配器的项计数为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's adapter
        updateEmptyView();
    }
});

它做了这件事,但有一个缺点:当最后一个元素正在被移除时,空视图出现在移除动画完成之前,在移除之后立即出现。所以我决定等到动画结束再更新UI。

令我惊讶的是,我找不到一个好的方法来收听RecycerView中的动画事件。首先想到的是使用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()方法,是否有更好的方法来达到预期的结果,即在单个元素的删除动画完成后显示空视图?

共有1个答案

姬旭
2023-03-14

目前,我找到的解决此问题的唯一有效方法是扩展ItemAnimator并将其传递给RecycerView,如下所示:

recyclerView.setItemAnimator(new DefaultItemAnimator() {
    @Override
    public void onAnimationFinished(RecyclerView.ViewHolder viewHolder) {
        updateEmptyView();
    }
});

但是这种技术并不通用,因为我必须从RecyclerView使用的具体ItemAnimator实现中扩展。在私有的内部CoolItemAnimator内部CoolRecycerView的情况下,我的方法根本不会起作用。

ps:我的同事建议将itemanimator以以下方式包装在装饰器内部:

recyclerView.setItemAnimator(new ListenableItemAnimator(recyclerView.getItemAnimator()));
 类似资料:
  • 问题内容: 我想等到Android ImageView中的动画完成*后再继续执行程序,这样做的正确方法是什么? (在这种情况下,“完成”是指它恰好一次遍历所有帧,并在最后一帧停止。我不清楚该动画是否会是android:oneshot =“ true”动画,因为我将多次使用它时间,但不会连续而是间歇地运行) 研究/猜测: 答:从本质上讲,我的问题似乎是Java线程问题,因为Android Anima

  • 我有一个由< code > RealmRecyclerViewAdapter 填充的< code > recycle view ,但不知何故,当数据更改时,没有动画播放。adapter类为不同的布局使用多个< code > view holder ,但这不应该影响动画,对吗? 用于设置 和适配器的代码如下所示: 将数据绑定到适配器的代码如下所述: 自动更新工作正常,但不知何故没有数据更改时没有动画

  • 我的RecyclView defaultItemAnimator有问题。当我使用elle fyItemRemve()删除我的一个项目时,我还会在另一个特定索引上调用elle fyItemChanged()来更改其中的文本。在删除动画期间,我在其上调用的项目通知fyItemChanged()会更改其文本,但会做一些看起来很傻的动画,像拇指疼痛一样突出。(它会立即移动到新位置,而其余的则会顺利移动到新

  • 我将recyclerview与扩展ListAdapter的适配器一起使用。我正在通过调整提交列表来更新内容。但每次内容更新(例如删除一项)时,recyclerview都会消失一秒钟,并与更新的内容一起重新出现。有两件事我不喜欢:第一是闪烁,第二是缺少默认动画。 如何修复它并显示流畅的默认动画? 适配器: 布局: 绑定适配器: SwipeToDeleteCallback: 我猜肯定有任何一行代码取消

  • 我有一个用于交互式过渡的自定义动画师。还有一个,根据过渡进度设置为。效果的动画代码如下: 我通过调用它,当从它到第一个的转换开始时,它在第二个上调用。 然而,我这里有一个问题。在动画结束之前调用完成块。当我第一次运行转换(没有取消它)时,它工作得很好,但在随后的运行过程中,它就不工作了。 我也曾尝试将动画添加到我的动画师中,但也没有成功。 此外,当我取消转换时,在实际动画结束之前调用完成块(在这种

  • 如何使用我的滑动刷新器/适配器来触发此动画?如何通过适配器实现此功能? 注意:我需要在RecyclerView首次填充CardView项及其包含的数据时也触发此动画。 我的RecyclerView适配器如下所示: 动画当前正在运行,但问题是,项目正在同时进行动画。我尝试通过创建一个自定义的方法来迭代这些项,但没有成功。不知何故,我需要单独访问/设置每个孩子的动画,并可能在每个动画之间设置延迟。然而