Android中RecyclerView拖拽、侧删功能的实现代码

下面是关于“Android中RecyclerView拖拽、侧删功能的实现代码”的完整攻略。

RecyclerView基础

在介绍实现RecyclerView拖拽、侧删功能之前,先简单介绍一下RecyclerView的基础知识。

RecyclerView是Android提供的新的可复用列表控件,使用了一个LayoutManager来管理Item的样式,数据由Adapter提供。其与ListView的不同之处在于:

  • RecyclerView可以实现多种布局效果;
  • 和ListView相比,它更加灵活,可扩展性更强;
  • 与ListView相比,它更易于实现Item间动画效果。

RecyclerView的基础用法类似于ListView,只是需要提供一个自定义的Adapter并实现自定义ViewHolder。RecyclerView处理Item点击以及长按事件时,需要设置一个ItemClickListener以及ItemLongClickListener。代码如下:

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(new MyAdapter(this));
recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL));

recyclerView.addOnItemTouchListener(new OnItemClickListener(recyclerView) {
    @Override
    public void onItemClick(RecyclerView.ViewHolder viewHolder) {
        //处理Item点击事件
    }

    @Override
    public void onItemLongClick(RecyclerView.ViewHolder viewHolder) {
        //处理Item长按事件
    }
});

实现拖拽功能

RecyclerView提供了ItemTouchHelper类来支持拖拽和滑动删除等交互操作。

  • 首先,创建一个ItemTouchHelper.Callback实例,通过实现其中的dragFlags和swipeFlags方法,设置支持哪些动作(拖拽、侧滑)以及方向(上、下、左、右等);
  • 接着,调用ItemTouchHelper的attachToRecyclerView方法将其附加到RecyclerView上;
  • 最后,需要在Adapter中实现onMove和onSwiped方法,来告诉ItemTouchHelper,在拖拽或侧滑时应该如何处理数据。

下面是一个简单的示例代码:

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.RIGHT;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    /**
     * 拖拽时调用
     */
    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        //交换数据
        mAdapter.swap(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    /**
     * 侧滑删除时调用
     */
    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        //删除数据
        mAdapter.remove(viewHolder.getAdapterPosition());
    }
});

//将itemTouchHelper附加到RecyclerView上
itemTouchHelper.attachToRecyclerView(recyclerView);

实现侧滑删除功能

RecyclerView默认并不支持侧滑删除,需要通过ItemTouchHelper来实现。

  • 在ItemTouchHelper.Callback的getMovementFlags方法中,设置Item侧滑的方向和方案;
  • 在ItemTouchHelper.Callback的onSwiped方法中,处理Item侧滑之后的逻辑。

下面是一个示例代码:

@Override
public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
    //只设置支持左右方向的Swipe
    return makeMovementFlags(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
    int position = viewHolder.getAdapterPosition();//获取swipe当前的item项position位置
    if(direction == ItemTouchHelper.LEFT){//向左侧滑删除,类似交互中竖直方向上的拖拽
        mAdapter.notifyItemRemoved(position);//adapter中对RecyclerView数据进行了删除操作
        mAdapter.itemList.remove(position);//从数据源中remove
        mAdapter.notifyItemRangeChanged(position,mAdapter.itemList.size()-position);//刷新被删除位置左侧的position
        Snackbar.make(viewHolder.itemView,"删除了第"+(position+1)+"个Item",Snackbar.LENGTH_LONG).setAction("撤销", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mAdapter.itemList.add(position,bean);//在数据源中添加被删除的数据
                mAdapter.notifyItemInserted(position);//在RecyclerView中添加被删除的item的数据
                mAdapter.notifyItemRangeChanged(position,mAdapter.getItemCount()-position);//刷新被删除位置左侧的position
            }
        }).show();
    }
}

至此,我们通过简单的示例讲解了如何实现RecyclerView拖拽、侧删功能的相关代码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中RecyclerView拖拽、侧删功能的实现代码 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 代码讲解C++继承和派生

    这里我就来详细讲解一下“代码讲解C++继承和派生”的完整攻略。 1. C++继承 C++中的继承是指从一个类中派生出另一个类,具体实现方式为在派生类的定义中使用“:”后面跟上基类的名称。 1.1 基类和派生类的定义 下面是一个基类的定义: class Shape { public: virtual void draw() = 0; virtual doubl…

    C 2023年5月24日
    00
  • C 程序 二进制转换为八进制

    下面是关于“C 程序 二进制转换为八进制”的完整使用攻略。 标题 C 程序二进制转换为八进制的完整使用攻略 介绍 在计算机领域中,二进制和八进制是两种常用的进制。我们可以使用 C 程序将二进制数字转换为八进制数字。在本文中,我们将讨论如何实现这项任务。 步骤 以下是将二进制转换为八进制的步骤: 我们需要在程序中接受一个二进制数字输入。 将输入的二进制数进行逐…

    C 2023年5月9日
    00
  • Java程序与C语言的区别浅析

    Java程序与C语言的区别浅析 相同点 Java程序和C语言程序都是计算机程序。两者都需要编译成计算机能够识别的二进制代码后才能执行。Java程序和C语言程序都需要按照指定的语法规则书写程序,并且它们都需要语言自带的IDE或编译器进行编写语法检查、编译等操作。 不同点 语法 Java程序与C语言的基本语法有较大差异。C语言程序中常用的指针操作、预处理器等在J…

    C 2023年5月30日
    00
  • snprintf函数的用法解析

    让我来向你介绍一下snprintf函数的用法解析。 什么是snprintf函数 snprintf是一个C库函数,用于格式化字符串并将结果输出到指定缓冲区。与printf函数不同的是,snprintf在输出的同时将结果存储在指定缓冲区中。它可以避免缓冲区溢出,因为在输出到缓冲区之前已经设置了输出的最大长度。 该函数的原型为: int snprintf(char…

    C 2023年5月22日
    00
  • c++实现发送http请求通过get方式获取网页源代码

    首先,C++实现发送HTTP请求需要使用到第三方库,最常用的是libcurl库。下面我们将具体介绍如何使用libcurl库来通过GET方式获取网页源代码。 步骤一:安装libcurl 根据自己的系统选择合适的安装方式,例如使用Linux系统下的包管理工具可以执行以下命令来安装: sudo apt-get install libcurl4-openssl-de…

    C 2023年5月24日
    00
  • C++中strstr函数的实现方法总结

    C++中strstr函数的实现方法总结 什么是strstr函数 strstr函数是C/C++中的字符串函数之一,用于在字符串中查找子串。其原型如下: char * strstr ( const char * str1, const char * str2 ); 它的功能是在 str1 字符串中查找第一次出现 str2 字符串的位置,如果未找到则返回null。…

    C 2023年5月24日
    00
  • 浅谈C语言的字节对齐 #pragma pack(n)2

    浅谈C语言的字节对齐 在C语言中,结构体是将不同类型的数据存储在一起的一种基本数据类型。在结构体中,结构体成员所占用的内存空间是按照类型大小和字节对齐规则来确定的。字节对齐是计算机领域中的一个重要话题,本文将深入浅出地讲解C语言的字节对齐。 定义 字节对齐指的是将数据存储在内存中时,按照一定的规则将数据的起始位置往后挪动若干字节,使得成员变量对齐到特定的地址…

    C 2023年5月23日
    00
  • 最新Rust错误处理简介

    最新Rust错误处理简介 错误处理是编写健壮软件的必备技能。在Rust中,错误处理被视为一等公民,并且Rust的语言设计使错误处理更加容易和健壮。在本文中,我们将讨论Rust中最新的错误处理方法。 Unrecoverable Errors 当程序遇到不可恢复的错误时,会产生不回溯错误(unrecoverable error),系统将终止程序并打印出错误信息。…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部