iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android仿QQ列表左滑删除操作
  • 486
分享到

Android仿QQ列表左滑删除操作

Android 2022-06-06 05:06:29 486人浏览 薄情痞子
摘要

最近学习了如何做一个像QQ的左滑RecyclerView的item显示选项的,主要是用到Scroller 我们首先新建一个自己的RecyclerView 定义好一些要用的的变量

最近学习了如何做一个像QQ的左滑RecyclerView的item显示选项的,主要是用到Scroller

我们首先新建一个自己的RecyclerView

定义好一些要用的的变量
重写构造方法,把前两个构造方法改为如下,使无论如何构造都要执行第三个构造方法
在第三个构造方法里初始化Scroller


public class LeftSwipeMenuRecyclerView extends RecyclerView {
  //置顶按钮
  private TextView tvTop;
  //删除按钮
  private TextView tvDelete;
  //item相应的布局
  private LinearLayout mItemLayout;
  //菜单的最大宽度
  private int mMaxLength;
  //上一次触摸行为的x坐标
  private int mLastX;
  //上一次触摸行为的y坐标
  private int mLastY;
  //当前触摸的item的位置
  private int mPosition;
  //是否在垂直滑动列表
  private boolean isDragging;
  //item是在否跟随手指移动
  private boolean isItemMoving;
  //item是否开始自动滑动
  private boolean isStartScroll;
  //左滑菜单状态  0:关闭 1:将要关闭 2:将要打开 3:打开
  private int mMenuState;
  private static int MENU_CLOSED = 0;
  private static int MENU_WILL_CLOSED = 1;
  private static int MENU_OPEN = 2;
  private static int MENU_WILL_OPEN = 3;
  //实现弹性滑动,恢复
  private Scroller mScroller;
  //item的事件监听
  private OnIteMactionListener mListener;
  public LeftSwipeMenuRecyclerView(Context context) {
    this(context, null);
  }
  public LeftSwipeMenuRecyclerView(Context context, @Nullable AttributeSet attrs) {
    this(context, attrs, 0);
  }
  public LeftSwipeMenuRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    mScroller = new Scroller(context, new LinearInterpolator());
  }

重写onTouchEvent方法

event主要有以下几个Action

ACTION_DOWN 手指接触到屏幕 ACTION_MOVE 手指在屏幕滑动 ACTION_UP 手指离开屏幕

一开始肯定要获取x和y的相对坐标


int x= (int) event.getX();
int y= (int) event.getY();

然后接下来分别处理3个不同的行为

1.ACTION_DOWN


case MotionEvent.ACTION_DOWN:
        if (mMenuState == MENU_CLOSED) {
          //根据坐标获得view
          View view = findChildViewUnder(x, y);
          if (view == null) {
            return false;
          }
          //获得这个view的ViewHolder
          RVAdapter.Holder holder = (RVAdapter.Holder) getChildViewHolder(view);
          //获得这个view的position
          mPosition = holder.getAdapterPosition();
          //获得这个view的整个布局
          mItemLayout = holder.llLayout;
          //获得这个view的删除按钮
          tvDelete = holder.tvDelete;
          //这个view的整个置顶按钮
          tvTop = holder.tvTop;
          //两个按钮的宽度
          mMaxLength = tvDelete.getWidth() + tvTop.getWidth();
          //设置删除按钮点击监听
          tvDelete.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
              mItemLayout.scrollTo(0, 0);
              mMenuState =MENU_CLOSED;
              mListener.OnItemDelete(mPosition);
            }
          });
          //设置置顶按钮点击监听
          tvTop.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view) {
              mItemLayout.scrollTo(0, 0);
              mMenuState =MENU_CLOSED;
              mListener.OnItemTop(mPosition);
            }
          });
          //如果是打开状态,点击其他就把当前menu关闭掉
        } else if (mMenuState == MENU_OPEN) {
          mScroller.startScroll(mItemLayout.getScrollX(), 0, -mMaxLength, 0, 200);
          invalidate();
          mMenuState = MENU_CLOSED;
          //该点击无效
          return false;
        } else {
          return false;
        }
        break;

2.ACTION_MOVE


      case MotionEvent.ACTION_MOVE:
        //计算偏移量
        int dx = mLastX - x;
        int dy = mLastY - y;
        //当前滑动的x
        int scrollx = mItemLayout.getScrollX();
        if (Math.abs(dx) > Math.abs(dy)) {
          isItemMoving = true;
          //超出左边界则始终保持不动
          if (scrollx + dx <= 0) {
            mItemLayout.scrollTo(0, 0);
            //滑动无效
            return false;
          //超出右边界则始终保持不动
          } else if (scrollx + dx >= mMaxLength) {
            mItemLayout.scrollTo(mMaxLength, 0);
            //滑动无效
            return false;
          }
          //菜单随着手指移动
          mItemLayout.scrollBy(dx, 0);
        //如果水平移动距离大于30像素的话,recyclerView不会上下滑动
        }else if (Math.abs(dx) > 30){
          return true;
        }
        //如果菜单正在打开就不能上下滑动
        if (isItemMoving){
          mLastX = x;
          mLastY = y;
          return true;
        }
        break;

3.ACTION_UP


case MotionEvent.ACTION_UP:
        //手指抬起时判断是否点击,静止且有Listener才能点击
        if (!isItemMoving && !isDragging && mListener != null) {
          mListener.OnItemClick(mPosition);
        }
        isItemMoving = false;
        //等一下要移动的距离
        int deltaX = 0;
        int upScrollx = mItemLayout.getScrollX();
        //滑动距离大于1/2menu长度就自动展开,否则就关掉
        if (upScrollx >= mMaxLength / 2) {
          deltaX = mMaxLength - upScrollx;
          mMenuState = MENU_WILL_OPEN;
        } else if (upScrollx < mMaxLength / 2) {
          deltaX = -upScrollx;
          mMenuState = MENU_WILL_CLOSED;
        }
        //知道我们为什么不直接把mMenuState赋值为MENU_OPEN或者MENU_CLOSED吗?因为滑动时有时间的,我们可以在滑动完成时才把状态改为已经完成
        mScroller.startScroll(upScrollx, 0, deltaX, 0, 200);
        isStartScroll = true;
        //刷新界面
        invalidate();
        break;

之后还要在onTouchEvent方法里刷新坐标


   //只有更新mLastX,mLastY数据才会准确
    mLastX = x;
    mLastY = y;
    return super.onTouchEvent(e);

因为我们用到了startScroll所以要重写computeScroll方法


  public void computeScroll() {
    //判断scroller是否完成滑动
    if (mScroller.computeScrollOffset()) {
      mItemLayout.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
      //这个很重要
      invalidate();
    //如果已经完成就改变状态
    } else if (isStartScroll) {
      isStartScroll = false;
      if (mMenuState == MENU_WILL_CLOSED) {
        mMenuState = MENU_CLOSED;
      }
      if (mMenuState == MENU_WILL_OPEN) {
        mMenuState = MENU_OPEN;
      }
    }
  }

**还要监听RecyclerView是否在上下滑动


 @Override
  public void onScrollStateChanged(int state) {
    super.onScrollStateChanged(state);
    //是否在上下滑动
    isDragging = state == SCROLL_STATE_DRAGGING;
  }

还要设置Listener


//设置Listener
  public void setOnItemActionListener(OnItemActionListener onItemActionListener) {
    this.mListener = onItemActionListener;
  }

这个Listener是要自己新建的


public interface OnItemActionListener {
  void OnItemClick(int position);
  void OnItemTop(int position);
  void OnItemDelete(int position);
}

最后是点击,置顶,删除在Activity里的回调

这里只展示回调实现部分,我这里用的List是LinkedList,可以在第一位添加数据


rv.setOnItemActionListener(new OnItemActionListener() {
      //点击
      @Override
      public void OnItemClick(int position) {
        Toast.makeText(MainActivity.this,"Click"+position,Toast.LENGTH_SHORT).show();
      }
      //置顶
      @Override
      public void OnItemTop(int position) {
        //获得当前位置的内容
        String temp =list.get(position);
        //移除这个item
        list.remove(position);
        //把它添加到第一个
        list.addFirst(temp);
        //更新数据源
        adapter.notifyDataSetChanged();
      }
      //删除
      @Override
      public void OnItemDelete(int position) {
        list.remove(position);
        //更新数据源
        adapter.notifyDataSetChanged();
      }
    });

Adapter和布局的代码太简单我就不放出来了,大家可以到源码里看看有什么

效果图

源码地址:https://GitHub.com/jkgeekJack/SlideLeftMenuRecyclerView

您可能感兴趣的文章:Android实现左滑删除列表功能Android仿QQ首页ListView左滑置顶、删除功能Android使用CardView作为RecyclerView的Item并实现拖拽和左滑删除Android 实现左滑出现删除选项Android仿QQ左滑删除置顶ListView操作Android使用PullToRefresh完成ListView下拉刷新和左滑删除功能Android ListView实现仿iPhone实现左滑删除按钮的简单实例Android自定义组合控件之自定义下拉刷新和左滑删除实例代码Android下拉刷新上拉加载更多左滑动删除Android仿微信实现左滑显示删除按钮功能


--结束END--

本文标题: Android仿QQ列表左滑删除操作

本文链接: https://www.lsjlt.com/news/22899.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android仿QQ首页ListView左滑置顶、删除功能
     Android 仿QQ首页ListView左滑置顶、删除等实现源码,具体内容如下效果图实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview; ...
    99+
    2023-05-30
  • uniapp左滑列表删除
    目录 效果index.vuedelSlideLeft.vuedelRightIconfont.css参考插件最后 效果 index.vue 使用页面 引入封装的页面delSlideL...
    99+
    2023-10-12
    uni-app uniapp左滑列表删除
  • vue怎么实现仿qq左滑置顶删除组件
    这篇文章主要讲解了“vue怎么实现仿qq左滑置顶删除组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么实现仿qq左滑置顶删除组件”吧!效果图:HTML代码:主要的html代码:&l...
    99+
    2023-07-04
  • Android自定义view实现列表内左滑删除Item
    目录前言需求运行效果编写代码主要问题动态生成TextView将TextView对齐到当前容器右端滑动出界问题滑动开始判定后续订正前言 上一篇文章自定义了一个左滑删除的Recycler...
    99+
    2023-02-09
    Android列表内左滑删除Item Android自定义view左滑删除Item
  • mpvue小程序如何实现仿qq左滑置顶删除组件
    小编给大家分享一下mpvue小程序如何实现仿qq左滑置顶删除组件,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果图:实现:1,上面说过mpvue的坑,比如里面的每一个的元素都是overf...
    99+
    2024-04-02
  • Android Recyclerview实现左滑删除功能
    本文实例为大家分享了Android Recyclerview实现左滑删除的具体代码,供大家参考,具体内容如下 1.先创建一个工具类 SlideRecyclerView public...
    99+
    2024-04-02
  • Android 实现左滑出现删除选项
    滑动删除的部分主要包含两个部分, 一个是内容区域(用于放置正常显示的view),另一个是操作区域(用于放置删除按钮)。默认情况下,操作区域是不显示的,内容区域的大小是填充整个容 器,操作区域始终位于内容区域的右面。当开始滑动的时候,整个容器...
    99+
    2023-05-31
    android 左滑 删除
  • android实现QQ微信侧滑删除效果
    最近由于项目需求,需要做一个listview中的item策划删除的效果,与是查找资料和参考了一些相关的博客,终于完美实现了策划删除的效果。先看一下效果图(研究了半天竟然没研究出来真机上gif图怎么做,大家将就看一下吧)。 &nbs...
    99+
    2023-05-30
  • 微信小程序实现列表项左滑删除效果
    本文实例为大家分享了微信小程序实现列表项左滑删除效果的具体代码,供大家参考,具体内容如下 效果 图片 WXML <view class="container">...
    99+
    2024-04-02
  • Android实现QQ侧滑(删除、置顶等)功能
    实现类似QQ滑动出现可操作项的功能,在网上看到有人自定义LinearLayout实现这个效果,但是灵活性有限。此demo使用开源项目SwipeLayout实现该功能。关于SwipeLayout的常用设置和属性,这里都做介绍,下面进入正题。一...
    99+
    2023-05-30
  • PythonPandas删除列操作
    使用del和drop方法删除DataFrame中的列,使用drop方法一次删除多列 数据准备: import pandas as pd   data = pd.read_excel(...
    99+
    2024-04-02
  • android如何基于SwipeRefreshLayout实现类QQ的侧滑删除
    小编给大家分享一下android如何基于SwipeRefreshLayout实现类QQ的侧滑删除,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!还是效果图优先效果图...
    99+
    2023-05-30
    android
  • Android自定义view实现左滑删除的RecyclerView详解
    目录概述需求编写代码I编写代码II编写代码III优化总结概述 最近安卓自定义view的知识看的很熟,但是却很久没动手了,这几天用kotlin手撕了原先一个左滑删除的RecyclerV...
    99+
    2022-11-13
    Android RecyclerView Android 左滑删除RecyclerView
  • Android仿微信联系人列表字母侧滑控件
    仿微信联系人列表字母侧滑控件, 侧滑控件参考了以下博客:Android实现ListView的A-Z字母排序和过滤搜索功能首先分析一下字母侧滑控件应该如何实现,根据侧滑控件的高度和字母的数量来平均计算每个字母应该占据的高度。在View的onD...
    99+
    2023-05-31
    android 侧滑控件
  • Python列表对象中元素的删除操作方法
    目录1.列表元素删操作的方法2.调用remove方法一次删除一个指定的元素3.调用pop方法一次只删除一个指定索引的元素3.1.使用pop方法删除列表中索引为2的元素3.2.使用po...
    99+
    2022-12-21
    Python列表元素删除操作 Python列表操作 Python列表元素
  • PythonPandas删除列操作怎么实现
    在Pandas中,可以使用“drop() ”方法来删除DataFrame中的列:1、使用“import pandas as pd”导入Pandas模块;2、创建一个DataFrame;3、使用“drop()”方法删除指定列;4、可以传递一个...
    99+
    2023-12-19
    pythonpandas pythonpandas删除列
  • Pythondrop()删除行列的操作方法
    在进行特征工程、划分数据集的工作中,drop()函数都能派上用场。它可以轻松剔除数据、操作列和操作行等。 drop()详细的语法如下: 删除行是index,删除列是columns: ...
    99+
    2023-05-15
    Python drop()删除行列 drop()删除行列
  • PostgreSQL中的删除列操作是什么
    本篇内容主要讲解“PostgreSQL中的删除列操作是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中的删除列操作是什么”吧!创建数据表...
    99+
    2024-04-02
  • 删除pandas中产生Unnamed:0列的操作
    我们在数据处理,往往不小心,pandas会“主动”加上行和列的名称,我现在就遇到了这个问题。 这个是pandas中to_csv生成的数据各种拼接之后的最终数据(默认参数,index=...
    99+
    2024-04-02
  • js实现添加删除表格操作
    本文实例为大家分享了js实现添加删除表格的具体代码,供大家参考,具体内容如下 效果: 1、点击添加按钮 往table中添加一行  将全选前面的复选框变成false 1.1....
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作