Java 如何在新项目的动画中添加RecyclerView幻灯片

Java 如何在新项目的动画中添加RecyclerView幻灯片,java,android,xml,android-layout,android-recyclerview,Java,Android,Xml,Android Layout,Android Recyclerview,我有一个RecyclerView,并将项目添加到索引0处的mCommentArrayList。我试图在视图顶部创建一个幻灯片动画,因为新项目(CardView)被添加到RecyclerView中 我知道有些库是可以使用的,我甚至探索过。然而,文件是有限的,我不确定采取什么方法 请注意,我将所有新项目添加到mcommentaraylist的索引0中,以便它们显示在视图的顶部。我知道适配器中有一些工作要做,特别是onBindViewHolder(),但我不知道要激活动画应该放什么 我第一次调用Fir

我有一个RecyclerView,并将项目添加到索引0处的
mCommentArrayList
。我试图在视图顶部创建一个幻灯片动画,因为新项目(CardView)被添加到RecyclerView中

我知道有些库是可以使用的,我甚至探索过。然而,文件是有限的,我不确定采取什么方法

请注意,我将所有新项目添加到
mcommentaraylist
索引0
中,以便它们显示在视图的顶部。我知道适配器中有一些工作要做,特别是
onBindViewHolder()
,但我不知道要激活动画应该放什么

我第一次调用Firebase查找数据以填充RecyclerView:

    mUpdateRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            setImage(dataSnapshot);
            setQuestion(dataSnapshot);
            createInitialCommentIDArray(dataSnapshot);
            mNumberOfCommentsAtPoll = (int) dataSnapshot.child(COMMENTS_LABEL).getChildrenCount();
            for (int i = 0; i < mNumberOfCommentsAtPoll; i++) {
                String commentID = (String) dataSnapshot.child(COMMENTS_LABEL).child(mCommentIDArrayList.get(i)).child("COMMENT").getValue();
                Log.v("COMMENT_ID", "The comment ID is " + commentID);
                String userID = (String) dataSnapshot.child(COMMENTS_LABEL).child(mCommentIDArrayList.get(i)).child("USER_ID").getValue();
                Log.v("USER_ID", "The user ID is " + userID);
                mCommentArrayList.add(0, new Comments(mUserAvatar, userID, commentID));
                mCommentAdapter.notifyDataSetChanged();
            }

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

设置recyclerview动画的最佳方法是使用
onbindviewholder方法

下面是如何做到这一点-

在适配器类中创建字段变量lastAnimatedPosition

private int lastAnimatedPosition = -1;
然后在onbindviewholder中-

 @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Comments comment = mDataSet.get(position);
        holder.userComment.setText(comment.getUserComment());
        holder.userID.setText("User " + position);
if (position > lastAnimatedPosition) {
      lastAnimatedPosition = position;
      Animation animation = AnimationUtils.loadAnimation(context, R.anim.my_anim_set);
      animation.setInterpolator(new AccelerateDecelerateInterpolator());
      ((ViewHolder) holder).container.setAnimation(animation);
      animation.start();
    }
    }
接下来在viewholder类中进行一些调整-

public class ViewHolder extends RecyclerView.ViewHolder {
        // each data item is just a string in this case
        protected ImageView userAvatar;
        protected TextView userID;
        protected TextView userComment;
        **protected View container;**


        public ViewHolder(View v) {
            super(v);
            **container = v;**
            userAvatar = (ImageView) v.findViewById(R.id.profile_image);
            userID = (TextView) v.findViewById(R.id.user_ID);
            userComment = (TextView) v.findViewById(R.id.user_comment_textview);
        }

        **public void clearAnimation() {
          container.clearAnimation();
        }**
    }
最后,只需在ViewDetachedFromWindow上覆盖
-

@Override
  public void onViewDetachedFromWindow(final ViewHolder holder) {
    holder.clearAnimation();
  }
更新

由于要设置动画的元素位于第0个索引中,请将
if(position>lastAnimatedPosition)
片段替换为-

if (position == 0) {
      lastAnimatedPosition = position;
      Animation animation = AnimationUtils.loadAnimation(context, R.anim.my_anim_set);
      animation.setInterpolator(new AccelerateDecelerateInterpolator());
      ((ViewHolder) holder).container.setAnimation(animation);
      animation.start();
    }

使用您刚才提到的库()可以很容易地将
SlideInAnimator
添加到
RecyclerView
中。只需使用以下代码将
动画师设置为
回收视图
(选择一个):

完成此操作后,只需调用
notifyItemInserted(position)
notifyItemRangeSerted(positionStart,itemCount)
即可触发动画。这些调用将触发
动画制作程序
,调用
notifyDatasetChanged()
不会

触发插入动画:

    recyclerView.getAdapter().notifyItemInserted(position);
    recyclerView.getAdapter().notifyItemRangeInserted(positionStart, itemCount);

希望此代码对您有所帮助

从_right.xml创建一个动画文件animation_

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="700"
android:fillAfter="false"
>

<translate
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="100%p"
android:toXDelta="0"
/>

<alpha
android:fromAlpha="0.5"
android:toAlpha="1"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>

</set>

在onBindViewHolder上的适配器中使用上述代码

谢谢,我会试一试,所以我完全不需要在调用动画时使用notifyDataSetChanged()?是的。如果希望动画正常工作,请不要依赖于调用notifyDataSetChanged();由于这是RecyclerView的默认行为,动画不会在该方法内触发启动。它实际上不起作用。视图中根本没有显示任何内容。我删除了notifyDataSetChanged()并添加了notifyItemInserted()方法。我可以创建一个新的SO帖子并显示代码?非常感谢,我将尝试一下。请记住,每个新项目都会添加到“0”索引中。我不确定onBindViewHolder方法会如何工作,因为我注意到所有视图都会滑入,而不仅仅是最新的……你是对的。。。。这将使所有元素滑入。对于“0”索引问题,我已经更新了我的答案。非常感谢,我会让你知道的。对onViewDetachedFromWindow()的重写实际上是做什么的?我对它的用途/功能有点困惑。这说明视图不再附着在窗口上。我用它告诉代码视图不再附加,因此它应该停止动画。如果我们不清除这里的动画,当我们快速滚动时会出现很多UI故障。明白了,非常感谢。Saurabh这是一个简单而完美的解决方案+1.
    recyclerView.getAdapter().notifyItemInserted(position);
    recyclerView.getAdapter().notifyItemRangeInserted(positionStart, itemCount);
<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="700"
android:fillAfter="false"
>

<translate
android:interpolator="@android:anim/decelerate_interpolator"
android:fromXDelta="100%p"
android:toXDelta="0"
/>

<alpha
android:fromAlpha="0.5"
android:toAlpha="1"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
/>

</set>
Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.animation_from_right);
        holder.itemView.startAnimation(animation);