[英]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.