一.按照傳統(tǒng) 先說我們想要的效果:


這就是我們想要的效果 在recycleview的item顯示在屏幕上的時(shí)候 添加一個(gè)簡單的動(dòng)畫效果(由50%放大到100%)
二.實(shí)現(xiàn)步驟:
首先按正常的流程,使用Recyceview實(shí)現(xiàn)下拉刷新和上拉加載更多:
http://www.itdecent.cn/p/0dd105736eaa
然后準(zhǔn)備一個(gè)視圖動(dòng)畫 我們想要的只有一個(gè)由50%放大到100%的效果 :
在res/anim新建一個(gè)xml文件scale_50_to_100,內(nèi)容為:
(第三行 增加了一個(gè)先慢后快的插值器 accelerate_interpolator,也可也不加,這里只是記錄以下插值器的使用)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator"
>
<!--縮放動(dòng)畫標(biāo)簽-->
<scale
android:fromXScale="0.5"
android:toXScale="1.0"
android:fromYScale="0.5"
android:toYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="1000"/>
</set>
關(guān)于視圖動(dòng)畫的使用參考:https://blog.csdn.net/yanbober/article/details/46481171
接下來在Recycleview的adapter中使用動(dòng)畫
在Holder中為每個(gè)item填寫好數(shù)據(jù)后,添加動(dòng)畫
@Override
public void setData(@NonNull NewsBean data, int position) {
newsTitle.setText(data.getTitle());
newsSource.setText(data.getSource());
newsTime.setText(data.getTime());
Glide.with(itemView.getContext()).load(data.getImageUrl())
.thumbnail(Glide.with(itemView.getContext()).load(R.drawable.loding))
.into(newsImg);
//添加itemView的動(dòng)畫 這里是直接為整個(gè)itemView添加一個(gè)動(dòng)畫
//也可以為itemView中的局部View 比如ImageView添加動(dòng)畫
Animation animation = AnimationUtils.loadAnimation(itemView.getContext(),R.anim.scale_50_to_100);
itemView.startAnimation(animation);
}
這樣我們想要的效果就實(shí)現(xiàn)了
可能會(huì)遇到的一點(diǎn)點(diǎn)問題:
仔細(xì)觀察"效果圖二"也就是那個(gè)美女的效果圖會(huì)發(fā)現(xiàn)一個(gè)問題,就是我們?cè)谏侠虞d更多后,原本存在于頁面上的圖片item也重新播放了動(dòng)畫
原因分析:
因?yàn)樵诩虞d更多添加數(shù)據(jù)后,調(diào)用了adapter.notifyDataSetChanged()導(dǎo)致所有item一起刷新了
@Override
public void showMoreData(List<PicEntity.ResultBean> data) {
mData.addAll(data);
mAdapter.notifyDataSetChanged();
}
解決方法:https://www.cnblogs.com/ganchuanpu/p/8000926.html
@Override
public void showMoreData(List<PicEntity.ResultBean> data) {
//記錄當(dāng)前的最底部的item位置
int position=mData.size()-1;
//增加數(shù)據(jù)
mData.addAll(data);
//只調(diào)用notifyItemRangeChanged方法 刷新之后新添加進(jìn)來的數(shù)據(jù)的item
//這樣就不會(huì)導(dǎo)致動(dòng)畫重復(fù)
mAdapter.notifyItemRangeChanged(position+1,data.size());
}
RecyclerView中notifyDataSetChanged刷新總結(jié)
除了adapter.notifyDataSetChanged()這個(gè)方法之外,新的Adapter還提供了其他的方法,如下:
public final void notifyDataSetChanged()
public final void notifyItemChanged(int position)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
public final void notifyItemInserted(int position)
public final void notifyItemMoved(int fromPosition, int toPosition)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
public final void notifyItemRemoved(int position)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)
基本上看到方法的名字就知道這個(gè)方法是干嘛的了,
第一個(gè)方法沒什么好講的,跟以前一樣。
notifyItemChanged(int position),position數(shù)據(jù)發(fā)生了改變,那調(diào)用這個(gè)方法,就會(huì)回調(diào)對(duì)應(yīng)position的onBindViewHolder()方法了,當(dāng)然,因?yàn)閂iewHolder是復(fù)用的,所以如果position在當(dāng)前屏幕以外,也就不會(huì)回調(diào)了,因?yàn)闆]有意義,下次position滾動(dòng)會(huì)當(dāng)前屏幕以內(nèi)的時(shí)候同樣會(huì)調(diào)用onBindViewHolder()方法刷新數(shù)據(jù)了。其他的方法也是同樣的道理。
public final void notifyItemRangeChanged(int positionStart, int itemCount),顧名思義,可以刷新從positionStart開始itemCount數(shù)量的item了(這里的刷新指回調(diào)onBindViewHolder()方法)。
public final void notifyItemInserted(int position),這個(gè)方法是在第position位置被插入了一條數(shù)據(jù)的時(shí)候可以使用這個(gè)方法刷新,注意這個(gè)方法調(diào)用后會(huì)有插入的動(dòng)畫,這個(gè)動(dòng)畫可以使用默認(rèn)的,也可以自己定義。
public final void notifyItemMoved(int fromPosition, int toPosition),這個(gè)方法是從fromPosition移動(dòng)到toPosition為止的時(shí)候可以使用這個(gè)方法刷新
public final void notifyItemRangeInserted(int positionStart, int itemCount),顯然是批量添加。
public final void notifyItemRemoved(int position),第position個(gè)被刪除的時(shí)候刷新,同樣會(huì)有動(dòng)畫。
public final void notifyItemRangeRemoved(int positionStart, int itemCount),批量刪除。