简体   繁体   English

如何为新项目添加 RecyclerView 滑入动画

[英]How To Add RecyclerView Slide In Animation for New Item

I have a RecyclerView and add items to mCommentArrayList at index 0. I am trying to create a slide-in animation at the top of the view as new items (CardViews) are added to the RecyclerView.我有一个RecyclerView和项目添加到mCommentArrayList索引0我想在查看新项目(CardViews)的顶部,以创建幻灯片的动画添加到RecyclerView。

I know there are libraries that can be used, and I have even explored https://github.com/wasabeef/recyclerview-animators .我知道有可以使用的库,我什至探索过https://github.com/wasabeef/recyclerview-animators However, the documentation is limited and I am unsure what approach to take.但是,文档有限,我不确定要采取什么方法。

Note that I add all new items to my mCommentArrayList at index 0 so that they appear at the top of the view.请注意,我将所有新项目添加到index 0处的mCommentArrayList ,以便它们出现在视图的顶部。 I know there is some work to be done in the adapter, specifically onBindViewHolder() , but I don't know exactly what to put in order to activate the animations.我知道在适配器中有一些工作要做,特别是onBindViewHolder() ,但我不知道确切地放什么来激活动画。

Where I first call to Firebase to find data to populate the RecyclerView:我首先调用 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) {

        }
    });

Subsequent Calls to Firebase on Data Change:在数据更改时对 Firebase 的后续调用:

@Override
protected void onStart() {
    super.onStart();
    mUpdateComments = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            mNumberOfCommentsAtPoll = (int) dataSnapshot.getChildrenCount();
            for (DataSnapshot x : dataSnapshot.child(COMMENTS_LABEL).getChildren()) {
                Log.v("DATA_SNAPSHOT", x.toString());
                if (mCommentIDArrayList.contains(x.getKey())) {
                    Log.v("Comment_Already_Added", x.getKey());
                } else {
                    Log.v("Child_Added_Called", "Child Added Called");
                    mCommentIDArrayList.add(x.getKey());
                    String commentID = (String) dataSnapshot.child(COMMENTS_LABEL).child(x.getKey()).child("COMMENT").getValue();
                    Log.v("New_Comment", "The new comment is " + commentID);
                    String userID = (String) dataSnapshot.child(COMMENTS_LABEL).child(x.getKey()).child("USER_ID").getValue();
                    Log.v("New_User_ID", "The new userID is " + userID);
                    mCommentArrayList.add(0, new Comments(mUserAvatar, userID, commentID));
                    mPollCommentsList.getAdapter().notifyItemInserted(0);
                }
            }
        }

Using the library you were talking about ( https://github.com/wasabeef/recyclerview-animators ) it's very easy to add a SlideInAnimator to your RecyclerView .使用您正在谈论的库( https://github.com/wasabeef/recyclerview-animators )很容易将SlideInAnimator添加到您的RecyclerView Just use the following code to set an Animator to your RecyclerView (pick one):只需使用以下代码将Animator设置为您的RecyclerView (选择一个):

    recyclerView.setItemAnimator(new SlideInDownAnimator());
    recyclerView.setItemAnimator(new SlideInRightAnimator());
    recyclerView.setItemAnimator(new SlideInLeftAnimator());
    recyclerView.setItemAnimator(new SlideInUpAnimator());

Once you have done this the you can simply trigger the animation by calling notifyItemInserted(position) or notifyItemRangeInserted(positionStart, itemCount) .完成此操作后,您可以通过调用notifyItemInserted(position)notifyItemRangeInserted(positionStart, itemCount)简单地触发动画。 These calls will trigger the Animator , calling notifyDatasetChanged() won't .这些调用将触发Animator ,调用notifyDatasetChanged()不会

Triggering the insertion animation:触发插入动画:

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

Hope this code help's you !希望这段代码对你有帮助!

create one animation file animation_from_right.xml创建一个动画文件 animation_from_right.xml

<?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>

in Activity在活动中

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

use above code in your Adapter on onBindViewHolder在 onBindViewHolder 上的适配器中使用上面的代码

The best way animate the recyclerview will be to do it in the onbindviewholder method .为 recyclerview 设置动画的最佳方法是在onbindviewholder method

Here is how to do it-这是如何做到的 -

create a field variable lastAnimatedPosition in the adapter class.在适配器类中创建一个字段变量 lastAnimatedPosition。

private int lastAnimatedPosition = -1;

Then in the onbindviewholder-然后在 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();
    }
    }

Next a few tweaks in your viewholder class-接下来在你的 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();
        }**
    }

And lastly simply override onViewDetachedFromWindow -最后简单地覆盖onViewDetachedFromWindow -

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

UPDATE更新

Since the element to be animated is in the 0th index replace the if (position > lastAnimatedPosition) snippet with -由于要设置动画的元素位于第 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();
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM