今天推荐一个RecyclerView的加载动画开源框架:recyclerview-animators,详情查看:github地址
这个框架接入非常简单,完全不用破坏你原有的adapter,而是采用传参扩展的方法进行包装,并且支持多种动画同时进行,举一个简单的例子:
SlideInRightAnimationAdapter slideInRightAnimationAdapter = new SlideInRightAnimationAdapter(adapter);
AlphaInAnimationAdapter alphaInAnimationAdapter = new AlphaInAnimationAdapter(slideInRightAnimationAdapter);
recyclerView.setAdapter(alphaInAnimationAdapter);
就这么简单的为你原来的adapter添加了两种动画,第一种是从右边向左边滑进,第二种是透明度变化,3行代码让你的RecyclerView瞬间高大上起来,效果还是很不错的!
笔者接入后,发现一个问题:这么棒的动画效果貌似只能在首次加载才有效,当然,这也没什么不妥的,但是,一般RecyclerView都会做下拉刷新功能,我们当然希望下拉刷新,清空数据重新加载后,仍然能看到动画效果,这可怎么办呢?
不要慌,看源码啊!
其实这个开源框架并不复杂,定义了一个抽象类AnimationAdapter,继承于我们常用的RecyclerView.Adapter,然后覆盖onBindViewHolder方法,对holder.itemView执行各种各样的属性动画。其中,是否执行动画关键就在于覆盖的onBindViewHolder方法中,如下:
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
mAdapter.onBindViewHolder(holder, position);
int adapterPosition = holder.getAdapterPosition();
if (!isFirstOnly || adapterPosition > mLastPosition) {
for (Animator anim : getAnimators(holder.itemView)) {
anim.setDuration(mDuration).start();
anim.setInterpolator(mInterpolator);
}
mLastPosition = adapterPosition;
} else {
ViewHelper.clear(holder.itemView);
}
}
注意到那个if语句没?isFirstOnly 这个变量的默认值是true,当然提供了相应的API:setFirstOnly(boolean firstOnly)可进行更改,如果设置为false后,根据判断条件,无论怎么都会一直执行加载动画,但这还不足以解决我们的问题啊,我们要的是:正常只有第一次加载才出现动画,只有在下拉刷新后才让加载动画重新出现。
看到条件判断中或语句后面的条件没:adapterPosition > mLastPosition,只要满足这个条件,那么也会执行加载动画,如果isFirstOnly=true,我们就是靠满足这个条件来执行第一次加载的动画的,关键就在于mLastPosition,它的默认值是-1,当完成第一次加载后,它会被设置会目前数据的最大位置值。
所以,解决的方案也非常简单,只需要在下拉刷新后,将mLastPosition重新恢复默认值-1即可,往下翻,果然找到了相应的API:setStartPosition(int start)
当然,如果你的RecyclerView有头部的话,建议下拉刷新后,将mLastPosition设置为0,这样的话头部就不会执行加载动画了。
事实再次证明,当你遇到问题时,并不一定非要去网上搜答案不可,你完全可以通过自己阅读源码来解决问题,而且,阅读源码的过程总会让你有意外之喜,你能在这个过程中学到很多的知识、设计方案以及编程思想。前提是你要能够沉下心来好好看,好好学。











网友评论