RecyclerView设置进场动画、设置子项之间的间距、解决不断刷新子项间距不断变大问题
效果图:
一、设置进场动画
通过 mRecyclerView.setLayoutAnimation(LayoutAnimationController controller)
设置:
步骤Ⅰ:编写动画效果(位于anim文件下),新建anim_item_slide_right.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<!--
动画效果:从右边滑入,从完全不可见到完全可见
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
android:fillAfter="true"
>
<translate
android:fromXDelta="100%p"
android:toXDelta="0"
/>
<alpha
android:fromAlpha="0.0"
android:toAlpha="1.0"
/>
</set>
步骤 Ⅱ:编写 layoutanimation
文件(位于anim文件下),新建layout_anim_item_right_slipe.xml
文件
<?xml version="1.0" encoding="utf-8"?>
<!--
效果:子项从右边滑入,延时10%
-->
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:animation="@anim/anim_item_slide_right"
android:delay="10%"
android:animationOrder="normal"
/>
步骤 Ⅲ:代码里面设置动画
// RecyclerView和适配器
private RecyclerView mRecyclerView;
private RcvSearchAdapter mAdapter;
// 创建布局动画控制类 LayoutAnimationController ,待会给RecyclerView设置动画
LayoutAnimationController lac_right_slide = AnimationUtils.loadLayoutAnimation(getContext(), R.anim.layout_anim_item_right_slipe);
// 设置动画
mRecyclerView.setLayoutAnimation(lac_right_slide);
mRecyclerView.setAdapter(mAdapter);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
// 需要重新启动布局时调用此方法
mRecyclerView.scheduleLayoutAnimation();
二、设置子项之间的间距
方法:定义一个子项装饰类 ItemSpaceDecoration
继承RecyclerView.ItemDecoration
,这里我定义在适配器中:
public class RcvSearchAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
......
/**
* 用来调节Item之间的间距的装饰类
*/
public static class ItemSpaceDecoration extends RecyclerView.ItemDecoration{
// item 之间的间距
private int itemSpace;
public ItemSpaceDecoration(int itemSpace) {
this.itemSpace = itemSpace;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
if(parent.getChildPosition(view) != 0){
outRect.top = itemSpace;
}
}
}
......
}
然后在 RecyclerView
调用 setItemDecoration(@NonNull ItemDecoration decor)
方法去设置子项间距:
/**
* RecyclerView子项之间的间距
*/
private static final int ITEM_SPACE = 30;
/**
* 子项装饰类
*/
private RcvSearchAdapter.ItemSpaceDecoration mDecoration;
// 这里间距是 ITEM_SPACE
mDecoration = new RcvSearchAdapter.ItemSpaceDecoration(ITEM_SPACE);
// 设置子项之间的间距
mRecyclerView.addItemDecoration(mDecoration);
三、解决不断刷新子项间距不断变大问题
① 原因:当我们给 RecyclerView
设置了装饰(ItemDecoration)
时,调用了addItemDecoration()
方法,但是这个方法里面没有清除过装饰,导致每次刷新都会设置一次,就会发生子项间距越来越大的问题
源码:
② 解决方法:在刷新前清除掉设置的ItemDecoration
:
// 这里需要清除RecyclerView的 ItemDecoration,不然不断刷新的时候会导致子项之间的间距越来越大
mRecyclerView.removeItemDecoration(mDecoration);