你的位置:首页 > 操作系统

[操作系统]Android之RecyclerView(二)


  上篇文章对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/ 
版权声明:本文版权归烟台杰瑞教育科技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:JRedu技术交流