RecyclerView的基本用法
RecyclerView已经出来很长时间了,我相信现在用recyclerview的肯定要比ListVIew的多,今天就总结一下这个RecyclerView的基本使用。
第一种:添加LayoutAnimator上效果
这个效果的实现首先在res下创建一个动画的文件夹anim,然后再在anim下创建一个名为item_animation_fall_down.xml里面的代码为
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="600"> <translate android:fromYDelta="-20%" android:toYDelta="0" android:interpolator="@android:anim/decelerate_interpolator" /> <alpha android:fromAlpha="0" android:toAlpha="1" android:interpolator="@android:anim/decelerate_interpolator" /> <scale android:fromXScale="105%" android:fromYScale="105%" android:toXScale="100%" android:toYScale="100%" android:pivotX="50%" android:pivotY="50%" android:interpolator="@android:anim/decelerate_interpolator" /> </set>
上面定义的动画元素将会同时运行,这里是对每个动画元素的解释:
Translate Y -20% to 0%
在动画开始前,把view向上移动自身高度的20%,然后让他下降到自己最终的位置。Alpha 0 to 1
从完全不可见慢慢过渡到完全可见。Scale X/Y 105% to 100%
放大到105%,然后缩小的实际大小。
再在anim下创建一个layoutAnimation名为layout_animation_fall_down.xml,代码为:
<layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:animation="@anim/item_animation_fall_down" android:delay="15%" android:animationOrder="normal" />
android:animation="@anim/item_animation_fall_down”
定义item运行的动画(资源)。android:delay=”15%"
为每个item动画添加一个延时,基于item动画的duration。0%将导致所有item同步运行,100%则让前一个item的动画运行完了下一个item才开始动画。我们这里使用的是15%,表示item A的动画运行了15%之后才开始运行B的动画。android:animationOrder="normal"
有三种选择:normal, reverse 和 random。它可以控制布局元素运行动画的顺序。Normal是按照布局的自然顺序( vertical: top to bottom, horizontal: left to right),Reverse跟Normal是相反的,Random则按照随即的顺序。
使用 LayoutAnimation
应用LayoutAnimation可以通过代码实现,也可以通过XML实现。XML的使用方式:
<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:layoutAnimation="@anim/layout_animation_fall_down" />
使用Java代码的方式:
int resId = R.anim.layout_animation_fall_down; LayoutAnimationController animation = AnimationUtils.loadLayoutAnimation(this, resId); recyclerView.setLayoutAnimation(animation);
如果让Adapter中的数据更新时也使用这种动画,可以在数据改变的时候执行LayoutAnimation就可以了,代码如下:
adapter.notifyDataSetChanged(); recyclerView.scheduleLayoutAnimation();
第2中是Item的交换和删除先上效果:
这个拖动跟删除只要是通过ItemTouchHelper来实现的:下面我贴出只要代码
1.要建一个类继承ItemTouchHelper.Callback
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback { private ItemTouchListener mListener; public ItemTouchHelperCallback(ItemTouchListener listener){ mListener = listener; } //这个地方是设置监听的事件 @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { return makeMovementFlags(ItemTouchHelper.UP|ItemTouchHelper.DOWN,ItemTouchHelper.LEFT); } //这就是交换会触发的方法 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { if(mListener != null){ mListener.onMove(viewHolder.getAdapterPosition(),target.getAdapterPosition()); } return true; } //这是删除的回调方法 @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { if(mListener != null){ mListener.onRemove(viewHolder.getAdapterPosition()); } } }2.创建一个接口类:用于当触发Callback中的方法是回调到Adapter
interface ItemHelperListener { /** * 删除时的回调 */ fun onRemove(position:Int) /** * 交换时的回调 */ fun onSwap(formPosition:Int, toPosition:Int) }
3.让Adapter实现上面的接口:
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> implements ItemTouchListener { @Override public void onMove(int from, int to) { Collections.swap(mData,from,to); notifyItemMoved(from,to); } @Override public void onRemove(int position) { mData.remove(position); notifyItemRemoved(position); } }
4.让ItemTouchHelper与RecyclerView绑定:
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(adapter)); itemTouchHelper.attachToRecyclerView(recyclerView);
这样就实现了上面的效果。
我将会在最近更新这个RecyclerView源码详解跟ItemTouchHelper详解