RecyclerView:如何创建插入动画效果?

时间:2015-03-11 12:09:14

标签: android animation delay android-recyclerview

我有ReyclerView使用LinearLayoutManagerAdapter<ViewHolder>。我有一个项目列表,我想在recyclelerview中显示插入(幻灯片放入)动画。我该怎么做?

我想根据项目的索引显示延迟线性增加的动画。

目前,如果我使用2个按钮,则添加&#39;并且&#39;删除&#39;,然后在recyclerview(notifyItemInserted()notifyItemRemoved()上执行相应的操作,动画很顺利。

如果我以编程方式循环数据集并添加项目,再次使用notifyItemInserted(),我看不到任何动画。我只是看到所有项目几乎同时出现。

如果我使用具有线性延迟的Asynctasks,然后在OnPostExecute()中添加/删除项目,我仍然看不到任何动画。另外,如果有多个插入线程在等待所有删除线程完成(没有删除线程可以运行的地方),我看到有可能遇到死锁。

我做错了什么?

我在SO上经历了与此相关的大部分问题,并且花了几天时间围绕着Recyclerview的动画部分,仍然没有运气。

3 个答案:

答案 0 :(得分:9)

以下是我在Adapter中添加动画的方法。这将使推动效果生动,行从右侧进入。

首先在xml(res/anim/push_left_in.xml

中定义动画
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="300"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
        android:duration="300" />
</set>

然后在适配器中将其设置为

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row;
    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        row = inflater.inflate(R.layout.music_list_item, null);
    } else {
        row = convertView;
    }

    ...

    //Load the animation from the xml file and set it to the row
    Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.push_left_in);
    animation.setDuration(500);
    row.startAnimation(animation);

    return row;
}

每次添加新行时都会显示此动画,它应该适用于您的情况。

修改

这是使用RecyclerView

添加动画的方法
@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
    holder.text.setText(items.get(position));

    // Here you apply the animation when the view is bound
    setAnimation(holder.container, position);
}

/**
 * Here is the key method to apply the animation
 */
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, android.R.anim.push_left_in);
        viewToAnimate.startAnimation(animation);
        lastPosition = position;
    }
}

答案 1 :(得分:5)

将此行添加到RecyclerView xml:

android:animateLayoutChanges="true"

答案 2 :(得分:2)

这对我有用:

animation.setStartOffset(position*100);