我想要实现的
我想使线性垂直RecyclerView中的项目按顺序显示。我希望第一项出现,然后第二项,然后第三项等等。下面是我想要完成的动画类型的一个例子。
我试过什么
我已经尝试过这个问题中提供的方法:如何在RecyclerView项出现时动态显示它们
然而,这并不是我想要完成的。这将导致RecyclerView中的所有项同时出现,而不是一次出现一个。
我的代码
public class ParentCommentsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private int lastPosition = -1;
//constructor and other code not shown...
@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
switch (viewHolder.getItemViewType()) {
case OP:
OPViewHolder ovh = (OPViewHolder) viewHolder;
configureOPViewHolder(ovh, position);
setAnimation(ovh.getContainer(), position);
break;
case COMMENT:
CommentViewHolder cvh = (CommentViewHolder) viewHolder;
configureCommentViewHolder(cvh, position);
setAnimation(cvh.getContainer(), position);
break;
default:
RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) viewHolder;
configureDefaultViewHolder(vh, position);
break;
}
}
@Override
public void onViewDetachedFromWindow(final RecyclerView.ViewHolder viewHolder)
{
switch (viewHolder.getItemViewType()) {
case OP:
((OPViewHolder)viewHolder).clearAnimation();
break;
case COMMENT:
((CommentViewHolder)viewHolder).clearAnimation();
break;
default:
break;
}
}
private void configureDefaultViewHolder(RecyclerViewSimpleTextViewHolder vh, int position) {
//code...
}
private void configureOPViewHolder(OPViewHolder vh1, int position) {
//code...
}
private void configureCommentViewHolder(CommentViewHolder vh2, int position) {
//code...
}
private void setAnimation(View viewToAnimate, int position)
{
// If the bound view wasn't previously displayed on screen, it's animated
if (position > lastPosition)
{
Animation animation = AnimationUtils.loadAnimation(context, R.anim.fade_in);
viewToAnimate.startAnimation(animation);
lastPosition = position;
}
}
}
发布于 2016-08-12 04:31:31
调用setAdapter
之后,可以运行以下命令:
recyclerView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
recyclerView.getViewTreeObserver().removeOnPreDrawListener(this);
for (int i = 0; i < recyclerView.getChildCount(); i++) {
View v = recyclerView.getChildAt(i);
v.setAlpha(0.0f);
v.animate().alpha(1.0f)
.setDuration(300)
.setStartDelay(i * 50)
.start();
}
return true;
}
});
示例显示简单的alpha动画,但可以在循环中运行所需的内容,并调整内插器、持续时间和启动延迟。
发布于 2016-08-13 21:14:52
我决定采用与妮可先前提出的方法不同的方法。他的方法很好用,而且非常容易,但是在添加和删除项目(从这里可以看到)时,它会导致一些错误的动画。
因此,我决定尝试另一种方法,使用布局动画控制器。下面是我用来实现同样结果的代码。
public void initialRVAnimation() {
AnimationSet set = new AnimationSet(true);
// Fade in animation
Animation fadeIn = new AlphaAnimation(0.0f, 1.0f);
fadeIn.setDuration(400);
fadeIn.setFillAfter(true);
set.addAnimation(fadeIn);
// Slide up animation from bottom of screen
Animation slideUp = new TranslateAnimation(0, 0, Utils.getScreenHeight(this), 0);
slideUp.setInterpolator(new DecelerateInterpolator(4.f));
slideUp.setDuration(400);
set.addAnimation(slideUp);
// Set up the animation controller (second parameter is the delay)
LayoutAnimationController controller = new LayoutAnimationController(set, 0.2f);
rv.setLayoutAnimation(controller);
// Set the adapter
adapter = new ItemAdapter(data, this);
recyclerView.setAdapter(adapter);
}
发布于 2019-06-22 19:05:26
简单的方法是在RecyclerView标记中用xml设置(或者用类似于上面的注释的代码)。
android:layoutAnimation="@anim/slide_left_in_layout_anim"
slide_left_in_layout_anim.xml
<?xml version="1.0" encoding="utf-8"?>
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@android:anim/slide_in_left"
android:delay="10%"
android:animationOrder="normal"
/>
注意:此动画仅在第一次加载数据时执行,如果您希望在添加/删除/移动项时添加动画,请查看ItemAnimator,我认为这个职位将帮助您了解一些有用的东西。
https://stackoverflow.com/questions/38909542
复制相似问题