首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在初始化适配器时(按顺序)动画RecyclerView项?

如何在初始化适配器时(按顺序)动画RecyclerView项?
EN

Stack Overflow用户
提问于 2016-08-12 03:42:12
回答 4查看 16.6K关注 0票数 18

我想要实现的

我想使线性垂直RecyclerView中的项目按顺序显示。我希望第一项出现,然后第二项,然后第三项等等。下面是我想要完成的动画类型的一个例子。

我试过什么

我已经尝试过这个问题中提供的方法:如何在RecyclerView项出现时动态显示它们

然而,这并不是我想要完成的。这将导致RecyclerView中的所有项同时出现,而不是一次出现一个。

我的代码

代码语言:javascript
运行
复制
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;
        }
    }

}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-12 04:31:31

调用setAdapter之后,可以运行以下命令:

代码语言:javascript
运行
复制
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动画,但可以在循环中运行所需的内容,并调整内插器、持续时间和启动延迟。

票数 21
EN

Stack Overflow用户

发布于 2016-08-13 21:14:52

我决定采用与妮可先前提出的方法不同的方法。他的方法很好用,而且非常容易,但是在添加和删除项目(从这里可以看到)时,它会导致一些错误的动画。

因此,我决定尝试另一种方法,使用布局动画控制器。下面是我用来实现同样结果的代码。

代码语言:javascript
运行
复制
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);
}
票数 11
EN

Stack Overflow用户

发布于 2019-06-22 19:05:26

简单的方法是在RecyclerView标记中用xml设置(或者用类似于上面的注释的代码)。

代码语言:javascript
运行
复制
android:layoutAnimation="@anim/slide_left_in_layout_anim"

slide_left_in_layout_anim.xml

代码语言:javascript
运行
复制
<?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,我认为这个职位将帮助您了解一些有用的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38909542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档