【问题标题】:RecyclerView item animation: Only animate initially visible itemsRecyclerView 项目动画:仅对最初可见的项目进行动画处理
【发布时间】:2017-03-08 19:02:12
【问题描述】:

我有以下代码为 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;
            }
        }
    }

【问题讨论】:

    标签: android xamarin android-recyclerview


    【解决方案1】:

    我在 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);
            }
        };
    

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

    【讨论】:

    • 嗨,纳比尔。非常感谢。今天晚些时候我会试试的:)
    • 我认为m_LastPosition 应该是lastPosition
    猜你喜欢
    • 2015-02-01
    • 2019-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多