Android之RecyclerView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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/ 
版权声明:本文版权归杰瑞教育技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:技术分享
 

以上是关于Android之RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

Android移动应用开发之ListView和RecyclerView的简单使用

Android UI设计之RecyclerView

Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

Android之RecyclerView简单使用

Android进阶之通用RecyclerView适配器打造方法

Android进阶之通用RecyclerView适配器打造方法