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

RecyclerView项目动画:仅为最初可见的项目设置动画

锺离嘉容
2023-03-14

我有以下代码来设置RecyclerView项目的动画。这工作得很好,但如果我向下滚动,它会为所有出现的项目设置动画。

我想要的是类似于Google Play音乐应用程序中的行为,其中动画仅为最初可见的项目播放。通过滚动变得可见的项目应该出现在没有动画适配器的情况下。知道如何存档这种行为吗?

  public class RecyclerViewAnimationAdapter : RecyclerView.Adapter
    {
        private int m_LastPosition = -1;

        public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position)
        {
            base.OnBindViewHolder(holder, position);

            animateItem(position, holder.ItemView);
        }

        public override void OnViewDetachedFromWindow(Object holder)
        {
            base.OnViewDetachedFromWindow(holder);

            var viewToAnimate = ((RecyclerView.ViewHolder) holder).ItemView;

            viewToAnimate.ClearAnimation();
        }

        private void animateItem(int position, View viewToAnimate)
        {
            if (position > m_LastPosition)
            {
                var animation = AnimationUtils.LoadAnimation(Application.Context, Resource.Animation.slide_in_bottom);

                viewToAnimate.StartAnimation(animation);

                m_LastPosition = position;
            }
        }
    }

共有1个答案

夏谦
2023-03-14

我在Android Studio中测试了这个方法,它成功了,通过一些小调整,它也应该适用于你:

class YourAdapter extends RecyclerView.Adapter{
    private int lastPosition = -1;
    private boolean isAnimation;

    YourAdapter(... )
    {
       ...
       this.isAnimation = true;
    }
    ....


    private void switchAnimation(boolean isAnimation)
    {
        this.isAnimation = isAnimation;
    }


    private void animateItem(int position, View viewToAnimate)
    {
        if (position > m_LastPosition && isAnimation)
        {
            var animation = AnimationUtils.LoadAnimation(Application.Context, Resource.Animation.slide_in_bottom);

            viewToAnimate.StartAnimation(animation);

            lastPosition = position;
        }
    }

}

然后在LayoutManager中重写方法onLayoutChildren(您必须将代码调整为C#):

layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false){
        @Override
        public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
            super.onLayoutChildren(recycler, state);
            myAdapter.switchAnimation(false);
        }
    };

如果有帮助,请告诉我;)

 类似资料:
  • 视图将被重新创建,使过渡变得非常奇怪,因为它在下一个项目移动的同时会在该项目的上方褪色。出现的新视图没有调整大小,它已处于完整大小。 重新创建视图时,旧视图淡出,新视图淡出,这会使视图背景颜色闪烁。 我还尝试在动画期间在item视图上设置,但这种方法的问题是RecycleView的布局会立即更新,并且不会跟随动画。 我已经为这两次尝试创建了一个小的演示项目。项目的来源在这里。

  • 我的问题:我的ListView中的一个项目在我开始滚动后会动画。它不是最后一项,动画应该完成。一旦问题消失,我滚动后,它只发生一次,并且只发生在列表中的单个项目上。 在我开始滚动ListView之后,如何停止单个项目的动画制作? 我希望在将项目添加到适配器时,动画仅运行一次。 我有一个列表适配器,当项目添加到列表中时,我在其中对它们进行动画处理。我正在使用声明的动画器在适配器的getView()方

  • 我想在recyclerview中创建可扩展的项目,我想,使用MotionLayout创建动画会非常简单。我创建了运动场景,并测试了当在回收器视图中视图无法设置动画时,单个项目是否能够独立工作。 我试着显示所有调试信息,它说转换正在进行,但recyclerview没有显示任何动画。我试着通知项目动画师,动画已经在我的viewholder上启动,但没有成功。 我预计motinolayout状态转换将在

  • 我已经用适配器和所有东西实现了一个回收器视图。我可以用 然后运行列表以通知适配器此更改 到目前为止一切顺利。我现在想做的是交换列表中的两个项目,并动画显示这一变化。 问题是,这不是动画,我不知道为什么。 我确实想要一些类似于简单反向动画的东西。 有什么想法吗?

  • 问题内容: 目前,我正在尝试像behaivior 一样实现Google Inbox ,并且我对电子邮件打开动画非常好奇。 我的问题是:该怎么做?我的意思是,他们使用了哪种方法?他们是否使用并更改了填充父母的高度?还是其他?如果这样做的话,他们如何通过拉动手势使其闭合,而底层元素则稍微可见。 谁能帮助我指向一些库或代码段/示例? 问题答案: 您的意思是:将recyclerview作为一个加载项,或者

  • 我是第一次使用 。一切正常,除了没有关于项目删除的动画,即使添加项目的动画工作正常。 我没有设置任何自定义项目动画师,但根据留档: 默认情况下,在<code>RecyclerView</code>中启用添加和删除项目的动画。 因此,删除时的动画应该可以正常工作。 我希望在删除时具有默认动画,但无法使其正常工作。 这是我如何设置RecycleView: 这是我的适配器: Fragment_routi