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

技术咨询:

时间: 2025-01-04 09:22:09

Android之RecyclerView(二)的相关文章

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment.使用时, 主要要依靠宿主Fragment的 getChildFragmentManager() 来获取FragmentManger.虽然看起来和在activity中添加fragment差不多, 但因为fragment生命周期及管理恢复模式不同, 其中有一些需要特别注意的地方.本文内容还包括了从Fragment迁移到v4.Fragment代码中需要改

[Android]使用RecyclerView替代ListView(三)

以下内容为原创,转载请注明: 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4268097.html  这次来使用RecyclerView实现PinnedListView的效果,效果很常见: 开发的代码建立在上一篇([Android]使用RecyclerView替代ListView(二):http://www.cnblogs.com/tiantianbyconan/p/4242541.html)基础之上. 修改布局如下: 1 <?xml vers

Android测试(二):Android 测试基础

Android测试(二):Android 测试基础 发布时间 2017年12月20日 虫师 原文:https://developer.android.com/training/testing/fundamentals.html 用户在不同的级别上与你的应用产生交互.从按下按钮到将信息下载到他们的设备上,因此,你应该在迭代开发应用程序时测试各种用例和交互. 使用迭代开发工作流 当你的应用程序进行扩展时,你可能会发现需要从服务器获取数据,与设备的传感器进行交互,可以还需要访问本地存储,或呈现复杂的用

Android学习Scroller(二)——ViewGroup调用scrollTo()

MainActivity如下: package cc.ac; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.app.Activity; /** * Demo描述: * 对ViewGroup调用sc

Android 自定义RecyclerView 实现真正的Gallery效果

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38173061 ,本文出自:[张鸿洋的博客] 上一篇博客我使用自定义HorizontalScrollView写了一个具有HorizontalScrollView效果和ViewPager特性的横向图片轮播,详见:Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果.其实制作横向滚动的不得不说另一个控件,就是Google

android binder 机制二(client和普通server)

在讲它们之间的通信之前,我们先以MediaServer为例看看普通Server进程都在干些什么. int main() { -- // 获得ProcessState实例 sp<ProcessState> proc(ProcessState::self()); // 得到ServiceManager的Binder客户端实例 sp<IServiceManager> sm = defaultServiceManager(); -- // 通过ServiceManager的Binder客户

详解Android ActionBar之二:ActionBar添加Tabs标签和下拉导航

本节主要讲解ActionBar如何添加Tabs标签和下拉导航. 一.添加标签 Tabs 在ActionBar中实现标签页可以实现android.app.ActionBar.TabListener ,重写onTabSelected.onTabUnselected和onTabReselected方法来关联Fragment.代码如下: Java代码 private class MyTabListener implements ActionBar.TabListener { private TabCon

Android学习Scroller(二)

MainActivity如下: package cc.testscroller1; import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.os.Bundle; import android.view.View; import android.view.View.OnClick

Android之十二微信UI界面设计

Android之十二微信UI界面设计 corners_bg.xml <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color=&qu