码迷,mamicode.com
首页 > 移动开发 > 详细

Android之RecyclerView(二)

时间:2016-02-04 18:14:10      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

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

Android之RecyclerView(二)

标签:

原文地址:http://www.cnblogs.com/jerehedu/p/5181828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!