我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android仿QQ左滑删除置顶ListView操作

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android仿QQ左滑删除置顶ListView操作

最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图:

大致思路原理:
- 通过设置margin实现菜单的显示与隐藏
- 监听onTouchEvent,处理滑动事件

上代码


import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.LinearLayout;
import android.widget.ListView;

public class SlideListView extends ListView {
  private String TAG = getClass().getSimpleName();
  private int mScreenWidth;
  private int mDownX;
  private int mDownY;
  private int mMenuWidth;
  private boolean isMenuShow;
  private boolean isMoving;
  private int mOperatePosition = -1;
  private ViewGroup mPointChild;
  private LinearLayout.LayoutParams mLayoutParams;
  public SlideListView(Context context) {
    super(context);
    getScreenWidth(context);
  }
  public SlideListView(Context context, AttributeSet attrs) {
    super(context, attrs);
    getScreenWidth(context);
  }
  public SlideListView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    getScreenWidth(context);
  }
  private void getScreenWidth(Context context) {
    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics dm = new DisplayMetrics();
    manager.getDefaultDisplay().getMetrics(dm);
    mScreenWidth = dm.widthPixels;
  }
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN:
        performActionDown(ev);
        break;
      case MotionEvent.ACTION_MOVE:
        performActionMove(ev);
        break;
      case MotionEvent.ACTION_UP:
        performActionUp();
        break;
    }
    return super.onTouchEvent(ev);
  }
  private void performActionDown(MotionEvent ev) {
    mDownX = (int) ev.getX();
    mDownY = (int) ev.getY();
    //如果点击的不是同一个item,则关掉正在显示的菜单
    int position = pointToPosition(mDownX, mDownY);
    if (isMenuShow && position != mOperatePosition) {
      turnToNormal();
    }
    mOperatePosition = position;
    mPointChild = (ViewGroup) getChildAt(position - getFirstVisiblePosition());
    if (mPointChild != null) {
      mMenuWidth = mPointChild.getChildAt(1).getLayoutParams().width;
      mLayoutParams = (LinearLayout.LayoutParams) mPointChild.getChildAt(0).getLayoutParams();
      mLayoutParams.width = mScreenWidth;
      setChildLayoutParams();
    }
  }
  private boolean performActionMove(MotionEvent ev) {
    int nowX = (int) ev.getX();
    int nowY = (int) ev.getY();
//    if (isMoving) {
//      if (Math.abs(nowY - mDownY) > 0) {
//        Log.e(TAG, "kkkkkkk");
//        onInterceptTouchEvent(ev);
//      }
//    }
    if (Math.abs(nowX - mDownX) > 0) {
      //左滑 显示菜单
      if (nowX < mDownX) {
        if (isMenuShow) {
          mLayoutParams.leftMargin = -mMenuWidth;
        } else {
          //计算显示的宽度
          int scroll = (nowX - mDownX);
          if (-scroll >= mMenuWidth) {
            scroll = -mMenuWidth;
          }
          mLayoutParams.leftMargin = scroll;
        }
      }
      //右滑 如果菜单显示状态,则关闭菜单
      if (isMenuShow && nowX > mDownX) {
        int scroll = nowX - mDownX;
        if (scroll >= mMenuWidth) {
          scroll = mMenuWidth;
        }
        mLayoutParams.leftMargin = scroll - mMenuWidth;
      }
      setChildLayoutParams();
      isMoving = true;
      return true;
    }
    return super.onTouchEvent(ev);
  }
  private void performActionUp() {
    //超过一半时,显示菜单,否则隐藏
    if (-mLayoutParams.leftMargin >= mMenuWidth / 2) {
      mLayoutParams.leftMargin = -mMenuWidth;
      setChildLayoutParams();
      isMenuShow = true;
    } else {
      turnToNormal();
    }
    isMoving = false;
  }
  private void setChildLayoutParams(){
    if(mPointChild != null){
      mPointChild.getChildAt(0).setLayoutParams(mLayoutParams);
    }
  }
  
  public void turnToNormal() {
    mLayoutParams.leftMargin = 0;
    mOperatePosition = -1;
    setChildLayoutParams();
    isMenuShow = false;
  }
}

item的布局要注意,因为在自定义view中写死的是获取第一个子布局为显示内容,所以需要将显示的样式写在一个容器中,将菜单写在另一个容器中,两个平行的关系。
xml文件定义如下:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="#FFFFFF"
  android:orientation="horizontal">
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="60dp"
    android:orientation="horizontal">
    <TextView
      android:id="@+id/main_tv_title"
      android:layout_width="wrap_content"
      android:layout_height="match_parent"
      android:layout_marginLeft="10dp"
      android:gravity="center_vertical"
      android:textSize="18sp" />
  </LinearLayout>
  <LinearLayout
    android:layout_width="180dp"
    android:layout_height="60dp"
    android:orientation="horizontal">
    <TextView
      android:id="@+id/main_tv_delete"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:background="#FF0000"
      android:gravity="center"
      android:text="删除"
      android:textColor="#FFFFFF" />
    <TextView
      android:id="@+id/main_tv_top"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1"
      android:background="#DFCDBF"
      android:gravity="center"
      android:text="置顶"
      android:textColor="#FFFFFF" />
  </LinearLayout>
</LinearLayout>

最后就是删除操作与置顶操作,这个就比较简单,给按钮添加点击事件即可。我是在adapter中定义实现,记得操作后要将菜单关掉!

上部分代码: 


    holder.tvTitle.setText(mInfos.get(position));
    holder.tvDelete.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        mInfos.remove(position);
        notifyDataSetChanged();
        mListView.turnToNormal();
      }
    });
    holder.tvTop.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        String temp = mInfos.get(position);
        mInfos.remove(position);
        mInfos.add(0, temp);
        notifyDataSetChanged();
        mListView.turnToNormal();
      }
    });

最后还有一个遗留问题,ListView左右滑动的时候上下也会滑动,这个有待探索与改进,也希望大家提提意见,帮我改进!

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


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android仿QQ左滑删除置顶ListView操作

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

下载Word文档

猜你喜欢

Android仿QQ左滑删除置顶ListView操作

最近闲来无事,于是研究了一下qq的左滑删除效果,尝试着实现了一下,先上效果图:大致思路原理: - 通过设置margin实现菜单的显示与隐藏 - 监听onTouchEvent,处理滑动事件 上代码import android.conten
2022-06-06

Android仿QQ首页ListView左滑置顶、删除功能

Android 仿QQ首页ListView左滑置顶、删除等实现源码,具体内容如下效果图实现源码:package com.duguang.baseanimation.ui.listivew.deletelistview; import
2023-05-30

Android仿QQ列表左滑删除操作

最近学习了如何做一个像QQ的左滑RecyclerView的item显示选项的,主要是用到Scroller 我们首先新建一个自己的RecyclerView 定义好一些要用的的变量 重写构造方法,把前两个构造方法改为如下,使无论如何构造都要执
2022-06-06

vue怎么实现仿qq左滑置顶删除组件

这篇文章主要讲解了“vue怎么实现仿qq左滑置顶删除组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue怎么实现仿qq左滑置顶删除组件”吧!效果图:HTML代码:主要的html代码:
2023-07-04

Android仿QQ列表滑动删除操作

这篇山寨一个新版QQ的列表滑动删除,上篇有说到QQ的滑动删除,推测原理就是ListView本身每个item存在一个Button,只不过普通的状态下隐藏掉了,检测到向左的滑动事件的时候弹出隐藏的Button,不过再切换Button状态的时候会
2022-06-06

Android ListView滑动删除操作(SwipeListView)

新版本的微信和QQ上引入的滑动删除功能是现在比较流行的一个功能。其实这个滑动删除的控件,github上已经有了,是一个热门的开源框架SwipeListView。不过,这个SwipeListView是一个framelayout,即是一个两层的
2022-06-06

Android实现QQ侧滑(删除、置顶等)功能

实现类似QQ滑动出现可操作项的功能,在网上看到有人自定义LinearLayout实现这个效果,但是灵活性有限。此demo使用开源项目SwipeLayout实现该功能。关于SwipeLayout的常用设置和属性,这里都做介绍,下面进入正题。一
2023-05-30

Android App中ListView仿QQ实现滑动删除效果的要点解析

本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示。但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制。所以决定继承ListView然后结合PopupWindow。
2022-06-06

Android ListView实现仿iPhone实现左滑删除按钮的简单实例

需要自定义ListView。这里就交FloatDelListView吧。 复写onTouchEvent方法。如下:@Overridepublic boolean onTouchEvent(MotionEvent ev) { switch (
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录