标签:
上篇文章对RecyclerView的使用做了简单的介绍,本篇文章将继续介绍。RecyclerView的adapter不同于ListView的适配器,除了提供了notifyDataSetChanged方法之外,还提供了更多的数据更新方法,结合ItemAnimator一起使用,可以起到不错的效果。Adapter中提供的方法如下图:
下面在上述的案例的基础上继续,最终完成效果如下图:
主要代码如下:
1、 为RecyclerView增加默认动画
recyclerView.setItemAnimator(new DefaultItemAnimator());
2、 实现删除方法:
public void delItem(View view){ mData.remove(2); adapter.notifyItemRemoved(2); }
3、 实现新增方法:
public void addItem(View view){ mData.add(2,"这是新增的Item"); adapter.notifyItemInserted(2); }
通过以上方式可以完成在某个位置删除和新增一个Item,并配有默认的动画效果。
除了上述实现之外,我们用的比较多的是滑动消失和拖放的效果,在RecyclerView中,同样可以实现并且使用官方提供的Api即可。实现这个效果之前,我们先熟悉一下相关的API。
ItemTouchHelper,该类是实现RecyclerView滑动消失和拖放的工具类,并提供了一个CallBack接口。在该接口中有如下方法:
1、 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder):用于返回拖放、滑动的方向和状态等,需要调用makeMovementFlags(int dragFlags, int swipeFlags)来生成返回值。
2、 public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) :当拖拽Item是调用该方法,第一个参数代表拖拽的item,第二个参数代表目标item。
3、 public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction):滑动Item时调用该方法,第二个参数代表滑动的方向。
4、 public boolean isItemViewSwipeEnabled():是否支持滑动返回true代表支持。
5、 boolean isLongPressDragEnabled():是否支持拖拽,返回true代表支持。
通过实现以上方法,我们就可以完成简单的滑动消失和拖放效果了,核心代码如下:
ItemTouchHelper的定义:
itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() { @Override public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { //滑动的时候支持的方向 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN; //拖拽的时候支持的方向 int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END; //必须调用该方法告诉ItemTouchHelper支持的flags return makeMovementFlags(dragFlags, swipeFlags); } @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { adapter.move(viewHolder.getAdapterPosition(), target.getAdapterPosition()); return true; } @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { adapter.delete(viewHolder.getAdapterPosition()); } @Override public boolean isItemViewSwipeEnabled() { return true; } @Override public boolean isLongPressDragEnabled() { return true; } });
在Adapter中分别定义delete和move方法,具体如下:
public void delete(int position) { mData.remove(position); notifyItemRemoved(position); } public void move(int from,int to){ String prev = mData.remove(from); mData.add(to > from ? to - 1 : to, prev); notifyItemMoved(from, to); }
最终实现效果如下图,所示:
标签:
原文地址:http://www.cnblogs.com/jerehedu/p/5181828.html