RecyclerView.ItemAnimator详解
关于RecyclerView 的使用大家应该都很是熟悉,相比ListView 而言RecyclerView添加了ViewHolder进行缓存view。同时RecyclerVIew对每个item的动画也有很好的支持。
RecyclerView提供了以下五种角色:
- RecyclerView.Adapter //适配器
- RecyclerView.ViewHolder //Holder用于缓存View
- RecyclerView.LayoutManger //布局器,负责Item的布局
- RecyclerView.ItemDecoration //负责为item附加子视图,可设置divider padding
- 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,重写方法,很简单。
- onCreateViewHolder() 创建Viewholder
- onBindViewHolder() 为Viewholder绑定数据
- 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());
}