RecyclerView.ItemAnimator

RecyclerView.ItemAnimator详解

关于RecyclerView 的使用大家应该都很是熟悉,相比ListView 而言RecyclerView添加了ViewHolder进行缓存view。同时RecyclerVIew对每个item的动画也有很好的支持。

RecyclerView提供了以下五种角色:

  1. RecyclerView.Adapter //适配器
  2. RecyclerView.ViewHolder //Holder用于缓存View
  3. RecyclerView.LayoutManger //布局器,负责Item的布局
  4. RecyclerView.ItemDecoration //负责为item附加子视图,可设置divider padding
  5. RecyclerView.ItemAnimator //负责添加和删除 数据时的动画效果

代码:

通过下面的代码,我们为RecyclerView添加线性布局管理器,设置ItemAnimator和Adapter。

final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);  
 // 创建线性布局管理器
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);  
// 为RecyclerView指定布局管理对象  
recyclerView.setLayoutManager(layoutManager);  

 final SampleRecyclerAdapter sampleRecyclerAdapter = new SampleRecyclerAdapter();  
//设置动画
recyclerView.setItemAnimator(ItemAnimator)

recyclerView.setAdapter(sampleRecyclerAdapter);  

看下Adapter的代码,继承自RecyclerView.Adapter,重写方法,很简单。

  1. onCreateViewHolder() 创建Viewholder
  2. onBindViewHolder() 为Viewholder绑定数据
  3. getItemCount() //返回item数量

public class SampleRecyclerAdapter extends 
        RecyclerView.Adapter<SampleRecyclerAdapter.ViewHolder>  
{ 


// 用于创建onCreateViewHolder
@Override  
public ViewHolder onCreateViewHolder(ViewGroup parentViewGroup, int i)  
{  
    View item = LayoutInflater.from(context).inflate(  
            R.layout.***, parentViewGroup, false);  
    //recyclerview未提供onitemclick方法,需要自己添加
item.setOnClickListener(...);
    return new ViewHolder(item);  

}  


// 为ViewHolder设置数据  
@Override  
public void onBindViewHolder(ViewHolder viewHolder, final int position)  
{  
    //  获取当前item中显示的数据  
    final Model model = list.get(position);  

    //  设置要显示的数据  
    viewHolder.textViewSample.setText(**);  
    viewHolder.itemView.setTag(**);  
}  

@Override  
public int getItemCount()  
{  

    return list.size();  
}  
//  删除指定的Item  
public void removeData(int position)  
{  
    list.remove(position);  
    //  通知RecyclerView控件某个Item已经被删除  
    notifyItemRemoved(position);  

}  
//  在指定位置添加一个新的Item  
public void addItem(Model model,int positionToAdd)  
{  
    list.add(model);
    //  通知RecyclerView控件插入了某个Item  
    notifyItemInserted(positionToAdd);  
}  

public static class ViewHolder extends RecyclerView.ViewHolder  
{  

    private final TextView textViewSample;  

    public ViewHolder(View itemView)  
    {  
        super(itemView);  

        textViewSample = (TextView) itemView  
                .findViewById(R.id.textViewSample);  
    }  
}  

}

最后看一下自定义RecyclerView.ItemAnimator的代码:

public class MyItemAnimator extends RecyclerView.ItemAnimator {

List<RecyclerView.ViewHolder> mAnimationAddViewHolders = new ArrayList<RecyclerView.ViewHolder>();
List<RecyclerView.ViewHolder> mAnimationRemoveViewHolders = new ArrayList<RecyclerView.ViewHolder>();

//需要执行动画时会系统会调用,用户无需手动调用
@Override
public void runPendingAnimations() {
    if (!mAnimationAddViewHolders.isEmpty()) {

        AnimatorSet animator;
        View target;
        for (final RecyclerView.ViewHolder viewHolder : mAnimationAddViewHolders) {
            target = viewHolder.itemView;
            animator = new AnimatorSet();

            animator.playTogether(
                    ObjectAnimator.ofFloat(target, "translationX", -target.getMeasuredWidth(), 0.0f),
                    ObjectAnimator.ofFloat(target, "alpha", target.getAlpha(), 1.0f)
            );

            animator.setTarget(target);
            animator.setDuration(100);
            animator.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {

                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    mAnimationAddViewHolders.remove(viewHolder);
                    if (!isRunning()) {
                        dispatchAnimationsFinished();
                    }
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
            });
            animator.start();
        }
    } else if (!mAnimationRemoveViewHolders.isEmpty()) {
    }
}

//remove时系统会调用,返回值表示是否需要执行动画
@Override
public boolean animateRemove(RecyclerView.ViewHolder viewHolder) {
    return mAnimationRemoveViewHolders.add(viewHolder);
}

//viewholder添加时系统会调用
@Override
public boolean animateAdd(RecyclerView.ViewHolder viewHolder) {
    return mAnimationAddViewHolders.add(viewHolder);
}

@Override
public boolean animateMove(RecyclerView.ViewHolder viewHolder, int i, int i2, int i3, int i4) {
    return false;
}

@Override
public boolean animateChange(RecyclerView.ViewHolder oldHolder, RecyclerView.ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {
    return false;
}

@Override
public void endAnimation(RecyclerView.ViewHolder viewHolder) {
}

@Override
public void endAnimations() {
}

@Override
public boolean isRunning() {
    return !(mAnimationAddViewHolders.isEmpty() && mAnimationRemoveViewHolders.isEmpty());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值