expandableListview实现侧滑删除

2023-11-19

本文地址:http://blog.csdn.net/xiehao_95/article/details/44628491


使用swipelistview实现侧滑删除这样Demo已经很普及了,但是项目需要,expandableListview的item也要实现侧滑删除,参照swipelistview的ontouch事件,对getChildItem中的每个item设置点击事件以及ontouch事件。


使用到的jar包nineoldandroids-2.4.0.jar。


废话不多说上代码

首先,item项的布局文件,由FrameLayout实现上下覆盖,我们移动的就是上面的一层


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:id="@+id/id_back"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:gravity="right" >

        <Button
            android:id="@+id/btn_delete"
            android:layout_width="wrap_content"
            android:layout_height="50dp"
            android:background="#00ffff"
            android:text="delete" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/id_front"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:background="#00ff00"
        android:gravity="center" >

        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    </LinearLayout>

</FrameLayout>


重写expandableListview适配器的item项的点击和ontouch响应

@Override
	public View getChildView(int groupPosition, final int position,
			boolean arg2, View convertView, ViewGroup parent) {

		convertView = LayoutInflater.from(context).inflate(R.layout.list_item,
				null);
		button = (Button) convertView.findViewById(R.id.btn_delete);
		textView = (TextView) convertView.findViewById(R.id.text);
		frontView = convertView.findViewById(R.id.id_front);

		frontView.setOnClickListener(new OnClickListener() {
		//因为重写ontouch事件使onChildClickListener失效,需要设置次监听来补救
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(context, position + "条目按下", Toast.LENGTH_SHORT)
						.show();
			}
		});

		new FrontViewToMove(frontView, listView);
		//关键语句,使用自己写的类来对frontView的ontouch事件复写,实现视图滑动效果
		
		button.setOnClickListener(new OnClickListener() { 
		// 为button绑定事件,可以用此按钮来实现删除事件

			@Override
			public void onClick(View v) {

				Toast.makeText(context, position + "按钮按下", Toast.LENGTH_SHORT)
						.show();

			}
		});

		textView.setTextSize(20);
		textView.setTextColor(Color.DKGRAY);
		textView.setText(ChildrenItem[groupPosition][position]);

		return convertView;

	}

 

最后,从swipelistview中提取的,实现动画效果,和屏蔽listview上下滚动的关键类。

 
</pre><pre name="code" class="java">package com.example.movetodelete;

import static com.nineoldandroids.view.ViewHelper.setTranslationX;
import static com.nineoldandroids.view.ViewPropertyAnimator.animate;
import android.annotation.SuppressLint;
import android.support.v4.view.MotionEventCompat;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ListView;

import com.nineoldandroids.animation.Animator;
import com.nineoldandroids.animation.AnimatorListenerAdapter;

/**
 * @author XieHao
 * 
 */
@SuppressLint({ "ClickableViewAccessibility", "Recycle" })
public class FrontViewToMove {

	private View frontView;// 所要滑动的视图
	private int downX;// 手指按下时的x坐标
	private boolean hasMoved = false;// 判断视图是否被移动
	private int xToMove = 200;// 视图所要被移动的距离,默认200
	private ListView listView;// 如果所需移动的视图为ListView或其子类的item项,传入视图容器,限制其上下滚动

	/**
	 * @param frontView
	 *            所要滑动的视图
	 */
	public FrontViewToMove(View frontView) {
		this.frontView = frontView;
		moveListener();
	}

	/**
	 * @param frontView
	 *            所要滑动的视图
	 * @param xToMove
	 *            视图所要被移动的距离
	 */
	public FrontViewToMove(View frontView, int xToMove) {
		this.frontView = frontView;
		this.xToMove = xToMove;
		moveListener();
	}

	/**
	 * @param frontView
	 *            所要滑动的视图
	 * @param listView
	 *            所要滑动的视图的容器
	 */
	public FrontViewToMove(View frontView, ListView listView) {
		this.frontView = frontView;
		this.listView = listView;
		moveListener();
	}

	/**
	 * @param frontView
	 *            所要滑动的视图
	 * @param listView
	 *            所要滑动的视图的容器
	 * @param xToMove
	 *            视图所要被移动的距离
	 */
	public FrontViewToMove(View frontView, ListView listView, int xToMove) {
		this.frontView = frontView;
		this.listView = listView;
		this.xToMove = xToMove;
		moveListener();
	}

	/**
	 * 设置frontView的OnTouch监听,使其产生滑动的动画效果
	 */
	public void moveListener() {
		frontView.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View view, MotionEvent motionEvent) {

				switch (MotionEventCompat.getActionMasked(motionEvent)) {
				case MotionEvent.ACTION_DOWN: {

					downX = (int) motionEvent.getRawX();
					if (hasMoved) {
						downX = downX + xToMove;
					} else {
						view.onTouchEvent(motionEvent);// 当视图没有被移动,返回事件,使点击事件可用。
					}
					return true;
				}

				case MotionEvent.ACTION_UP: {

					float deltaX = motionEvent.getRawX() - downX;
					boolean swap = false;

					if ((deltaX > -xToMove / 2 && hasMoved)
							|| (deltaX < -xToMove && !hasMoved)) {
						swap = true;
					}

					if (swap) {
						if (!hasMoved) {
							generateRevealAnimate(frontView, -xToMove);
							hasMoved = true;
						} else {
							generateRevealAnimate(frontView, 0);
							hasMoved = false;
						}
					} else {
						if (hasMoved) {
							generateRevealAnimate(frontView, -xToMove);
						} else {
							generateRevealAnimate(frontView, 0);
						}
					}

					break;
				}

				case MotionEvent.ACTION_MOVE: {
					float deltaX = motionEvent.getRawX() - downX;

					MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);

					cancelEvent.setAction(MotionEvent.ACTION_CANCEL
							| (motionEvent.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));

					if (deltaX < -10) {
						view.onTouchEvent(cancelEvent);// 当滑动时清空该视图的点击事件
						if (null != listView) {// 当视图滑动时限制listView的上下滚动
							listView.requestDisallowInterceptTouchEvent(false);
							listView.onTouchEvent(cancelEvent);
						}
					}

					if (!(deltaX > 0 && !hasMoved)) {
						setTranslationX(frontView, deltaX);
					}
					return true;
				}
				}
				return false;
			}
		});

	}

	/**
	 * @param view
	 *            所要移动的视图
	 * @param deltaX
	 *            最终移动的距离
	 */
	private void generateRevealAnimate(final View view, float deltaX) {
		int moveTo = 0;
		moveTo = (int) deltaX;
		animate(view).translationX(moveTo).setDuration(10)
				.setListener(new AnimatorListenerAdapter() {
					@Override
					public void onAnimationEnd(Animator animation) {

					}
				});
	}

}


 

最后一个类,完全可以当做工具类来使用,单独的控件,listview及其子类都适用此方法。


demo下载地址点击打开链接


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

expandableListview实现侧滑删除 的相关文章

  • Hibernate之inverse和cascade详解

    继Hibernate学习笔记整理之后 发现inverse和cascade这两个属性在配置过程中比较含糊 仔细比较一下是有些地方比较像 所以很容易搞糊涂 借助此文来阐述下inverse和cascade的区别 什么是inverse 默认值为fa
  • centos8安装postgresql步骤

    1 安装源 1 sudo yum y install epel release 2 postgresql官网发布的postgresql对应的安装源 sudo yum install y https download postgresql o
  • There are multiple modules with names that only differ in casing.

    问题 在 npm run dev 后 控制台出现警告 没有出现链接 但是在浏览器上直接输入地址http localhost 8080 又可显示界面 There are multiple modules with names that onl
  • 华为机试HJ55 挑7

    HJ55 挑7 Python 题目 解题思路 代码 结果 题目 解题思路 1 多组输入 需要循环 2 循环查找到输入数值即可 字符串查找用in 能否整除 求余后判断是否 0 3 最后打印找到的数字的列表长度 代码 def func n in
  • 逐行对比LLaMA2和LLaMA模型源代码

    几个小时前 2023年7月18日 Meta发布了允许商用的开源模型LLaMA2 笔者逐行对比了LLaMA2模型源代码 和LLaMA相比 几乎没有改动 细节如下 是否改动 LLaMA2 LLaMA 模型整体构架 无 Transformer T
  • 面试必考真题

    1 输入一个链表 反转链表后 输出新链表的表头 package com csu marden public class Demo1 public static void main String args Node head new Node
  • 解决“17: 错误:程序中有游离的‘\240’,\302’

    参考链接 https blog csdn net asuphy article details 54602426 执行如下命令即可 sed i s o240 o302 g dy haikang test cpp
  • Invalid bound statement (not found):

    BUG描述 在执行动态SQL出现问题 原因 mapper接口中的方法名和mapper xml中的id标签不一致 解决方案 修改mapper接口中的方法名 使其对应到mapper xml中的id标签 参考资料
  • openssl的x509命令简单入门

    openssl的x509命令简单入门 openssl是一个强大的开源工具包 它能够完成完成各种和ssl有关的操作 命令说明 openssl help 会得到如下的提示 openssl Error help is an invalid com
  • 数据库常用命令之外键(foreign key)之多对一(总结,基础)

    我是小白 刚接触MySQL不久 现阶段正在学习 为此在CSDN上留下自己的学习笔记 如果有错误的地方还请大家见谅 评论或者私发我错误地方哦 谢谢大家 嘿嘿 此篇将记录外键的相关知识 上篇内容为对一张表的约束条件 传送门 创建表的完整性语法
  • golang基础教程

    目录 golang基础教程 一 环境搭建 golang基础教程 二 开发规范及API golang基础教程 三 变量与数据类型概述 golang基础教程 四 基本数据类型 golang基础教程 五 基本数据类型的转换 golang基础教程
  • 缺少nodejs环境,请在设置中配置nodejs的安装路径 - HBuilder - uniapp

    HBuilder运行uni app项目 点击 运行到 提示 缺少nodejs环境 请在设置中配置nodejs的安装路径 解决办法 找到工具 设置 运行配置 node运行配置 运行终端类型 选择 内置 外部 如果已经配置过 关闭编译器 重新打
  • Unity_如何使相机视角一直跟随角色移动

    实例代码如下 using System Collections using System Collections Generic using UnityEngine 相机视角跟踪 public class FollowTarget Mono
  • QHash & QMap 的顺序问题 (***)

    QT关联容器QMap QHash的Key值自动排序问题 对QMap中的key进行自定义排序 如何取消QMap自动排序 让QMap按照插入的顺序排列 通过插入顺序循环QHash QMap QHash插入后的显示顺序以及记录插入顺序的数据结构
  • OpenGL图形管线和坐标变换

    1 OpenGL 渲染管线 OpenGL渲染管线分为两大部分 模型观测变换 ModelView Transformation 和投影变换 Projection Transformation 做个比喻 计算机图形开发就像我们照相一样 目的就是
  • 最实用的chrome插件

    前言 说真的第一次看到CSDN这个插件的时候并没有感觉特别吸引我的地方 因为我个人安装了好多的插件 第二次看到CSDN插件还是因为广告上说的参赛拿奖 其实我的动机也不是很纯o o 插件地址 CSDN插件 走起 对于谷歌的插件安装方式很多 可
  • springboot——集成elasticsearch进行搜索并高亮关键词

    目录 1 elasticsearch概述 3 springboot集成elasticsearch 4 实现搜索并高亮关键词 1 elasticsearch概述 1 是什么 Elasticsearch 是位于 Elastic Stack 核心
  • C51单片机数码管动态显示

    数码管作为最廉价的输出设备 在各种自动化设备中有很大的应用 最简单普通的显示方式为动态刷新显示 称为假动态显示 即通过分时扫描每一位 利于人眼的视觉停留现象 造成一种静态显示的效果 如下图所示 C51单片机由于运行速度很慢 在高刷新频率下
  • ASCII与C简单数据类型

    ascII与简单数据类型 1 打印出所有ascII表中的字符 思路 ascII码值与阿拉伯数字0 127对应 故可以先将其以数字形式存在数组空间或内存空间中 然后用 c一个一个打印出来即可 本次采用数组进行存储 代码 include
  • 2013年8月11日星期日(7。15 色彩动画)

    距离上次封装有一个月了 PHYSX知道怎么弄朝向和位置了 我决定业余时间可以弄弄小游戏 这个例子是通过改变调色板ID来达到颜色的亮灭 这个肯定过时了 不过思路还是不错的 各个常量和结构体类型 define BLINKER ADD 0 add

随机推荐

  • 探索第三方 API 服务的身份验证方法:优点和缺点

    探索第三方 API 服务的身份验证方法 优点和缺点 赛斯 法特的相片 赛斯法特 2023 年 3 月 18 日 4分钟阅读 嗨 大家好 我们中的大多数人已经使用多个第三方 API 服务来实现您的业务逻辑 是的 他们中的大多数都有不同的身份验
  • mongodb安装(1)

    目录 一 mongodb安装 1mongodb介绍 2下载mongodb 3安装mongodb 4 启动mongodb 5 安装studio3t 一 mongodb安装 1mongodb介绍 2下载mongodb MongoDB 提供了可用
  • eclipse 环境配置第一个webapp的发布 及jsp代码的执行

    GBK 所有中文操作系统默认的编码 UTF 8 支持识别各个国家的字符 但这样 之前的代码如果用的是GBK编码 则会变成乱码 我们可以建一个新的工作区 新建一个文件夹 存放workspace 选择workspace位置后 等待重启 以后再建
  • 手把手教你进行APP数据埋点

    经过大半年的努力 产品终于开始趋向稳定 之前的版本一直在探索 需求经常改动 没时间系统进行埋点 随着产品的稳定以及工作的深入 越发认识到数据的重要性 所以开始着手数据埋点相关事项 这次亲历了产品 APP 从零开始进行数据埋点的过程 分享出来
  • 【数据分析与可视化】Seaborn库简介及风格设置详解(图文解释 超详细)

    需要源码和PPT请点赞关注收藏后评论区留言私信 一 Seaborn简介 Matplotlib绘图基本模仿MATLAB绘图库 其绘图风格和MATLAB类似 由于MATLAB绘图风格偏古典 因此 Python开源社区开发了Seaborn绘图模块
  • 神经网络权重是什么意思,神经网络权值和阈值

    BP神经网络中初始权值和阈值的设定 1 首先需要了解BP神经网络是一种多层前馈网络 2 以看一下在matlab中BP神经网络的训练函数 有梯度下降法traingd 弹性梯度下降法trainrp 自适应lr梯度下降法traingda等 3 在
  • 深度学习-算法的鲁棒性与稳定性解析

    文章与视频资源多平台更新 微信公众号 知乎 B站 头条 AI研习图书馆 深度学习 大数据 IT编程知识与资源分享 欢迎关注 共同进步 1 引言 鲁棒 的英文是robustness 中文译为强健 稳健 所以说算法的鲁棒性直白点说就是健壮的 稳
  • 【硬刚大数据之学习路线篇】2021年从零到大数据专家的学习指南(全面升级版)

    欢迎关注博客主页 https blog csdn net u013411339 本文由 王知无 原创 首发于 CSDN博客 本文首发CSDN论坛 未经过官方和本人允许 严禁转载 欢迎点赞 收藏 留言 欢迎留言交流 声明 本篇博客在我之前发表
  • Kong网关 入门安装与配置

    简介 Kong 是由Mashape公司开源的 基于Nginx的API gateway 特点 可扩展 支持分布式 模块化 功能 授权 日志 ip限制 限流 api 统计分析 存在商业插件Galileo等 也可自己研发 请求转化 跨域 CORS
  • java.lang.StringIndexOutOfBoundsException: String index out of range: 22

    报错 in thread main java lang StringIndexOutOfBoundsException String index out of range 22 原因 for int i 0 i lt 255 i 输入的字符
  • element ui的el-tree多选树(复选框)父子节点关联不关联的问题,选中当前节点,他的子节点和父节点是否被选中,非常详细

    element ui的el tree多选树 复选框 父子节点关联不关联的问题 选中当前节点 他的子节点和父节点是否被选中 非常详细 属性check strictly 官方文档提供属性check strictly 在显示复选框的情况下 是否严
  • SQL Server2012 安装方法详解

    欢迎大家关注我的公众号 添加我为好友 首先要找到自己下载好的安装包 并且保持网络畅通 最近有不少细心的小伙伴反应安装包有问题 我这里进行了一下更新 链接 https pan baidu com s 1bB WS zmHy ow34mU ET
  • scss的基本语法的使用

    scss 1 声明变量 声明变量符 变量名称 变量值 eg width300 300px 2 变量调用 width300 300px 声明 main width width300 调用 3 局部变量和全局变量 定义在局部的变量不会影响其他的
  • 关于不重启Tomcat自动加载改变的class文件

    修改server xml 在Host标签下加入以下配置
  • cmake 怎么设定 prefix ?

    cmake D CMAKE INSTALL PREFIX usr
  • 分页节点

    动态调度技术 分页数据库 osg PageLOD 动态调度技术 如果数据庞大 那么是不可能一次性全部载入内存的 因此需要动态调度技术 动态调度技术 在显示当前视域中的场景元素的同时 预判下一步可能载入的数据 以及那些短时间内不会被看到的数据
  • win11共享打印机无法连接怎么办

    很多小伙伴都将电脑更新升级成Win11系统 当我们使用多台电脑却只有一台打印机时 就需要共享打印机却出现了Win11共享打印机无法连接的情况 遇到这种问题应该怎么解决呢 下面小编就给大家详细介绍一下Win11共享打印机无法连接的解决方法 大
  • hexo tags-标签设置-aloha

    打开博客界面里面的 config yml进行配置 打开如下 找到类似于下面这些的代码行 Directory source dir source public dir public tag dir tags 标签 archive dir ar
  • MySQL-group_concat()

    创建表格 CREATE TABLE dept emp emp no int 11 NOT NULL dept no char 4 NOT NULL from date date NOT NULL to date date NOT NULL
  • expandableListview实现侧滑删除

    本文地址 http blog csdn net xiehao 95 article details 44628491 使用swipelistview实现侧滑删除这样Demo已经很普及了 但是项目需要 expandableListview的i