Android滑动删除数据功能的实现代码
发布时间 - 2026-01-10 22:39:33 点击率:次今天学习了新的功能那就是滑动删除数据。先看一下效果
我想这个效果大家都很熟悉吧。是不是在qq上看见过这个效果。俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面。
activity_lookstaff.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tv_title"
style="@style/GTextView"
android:text="全部员工" />
<com.rjxy.view.DeleteListView
android:id="@+id/id_listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_title">
</com.rjxy.view.DeleteListView>
</RelativeLayout>
delete_btn.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/id_item_btn"
android:layout_width="60dp"
android:singleLine="true"
android:layout_height="wrap_content"
android:text="删除"
android:background="@drawable/d_delete_btn"
android:textColor="#ffffff"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="15dp"
/>
</LinearLayout>
d_delete_btn.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/btn_style_five_focused" android:state_focused="true"></item> <item android:drawable="@drawable/btn_style_five_pressed" android:state_pressed="true"></item> <item android:drawable="@drawable/btn_style_five_normal"></item> </selector>
DeleteListView .java
package com.rjxy.view;
import com.rjxy.activity.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
public class DeleteListView extends ListView
{
private static final String TAG = "DeleteListView";
/**
* 用户滑动的最小距离
*/
private int touchSlop;
/**
* 是否响应滑动
*/
private boolean isSliding;
/**
* 手指按下时的x坐标
*/
private int xDown;
/**
* 手指按下时的y坐标
*/
private int yDown;
/**
* 手指移动时的x坐标
*/
private int xMove;
/**
* 手指移动时的y坐标
*/
private int yMove;
private LayoutInflater mInflater;
private PopupWindow mPopupWindow;
private int mPopupWindowHeight;
private int mPopupWindowWidth;
private Button mDelBtn;
/**
* 为删除按钮提供一个回调接口
*/
private DelButtonClickListener mListener;
/**
* 当前手指触摸的View
*/
private View mCurrentView;
/**
* 当前手指触摸的位置
*/
private int mCurrentViewPos;
/**
* 必要的一些初始化
*
* @param context
* @param attrs
*/
public DeleteListView(Context context, AttributeSet attrs)
{
super(context, attrs);
mInflater = LayoutInflater.from(context);
touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
View view = mInflater.inflate(R.layout.delete_btn, null);
mDelBtn = (Button) view.findViewById(R.id.id_item_btn);
mPopupWindow = new PopupWindow(view, LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
/**
* 先调用下measure,否则拿不到宽和高
*/
mPopupWindow.getContentView().measure(0, 0);
mPopupWindowHeight = mPopupWindow.getContentView().getMeasuredHeight();
mPopupWindowWidth = mPopupWindow.getContentView().getMeasuredWidth();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
int action = ev.getAction();
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (action)
{
case MotionEvent.ACTION_DOWN:
xDown = x;
yDown = y;
/**
* 如果当前popupWindow显示,则直接隐藏,然后屏蔽ListView的touch事件的下传
*/
if (mPopupWindow.isShowing())
{
dismissPopWindow();
return false;
}
// 获得当前手指按下时的item的位置
mCurrentViewPos = pointToPosition(xDown, yDown);
// 获得当前手指按下时的item
View view = getChildAt(mCurrentViewPos - getFirstVisiblePosition());
mCurrentView = view;
break;
case MotionEvent.ACTION_MOVE:
xMove = x;
yMove = y;
int dx = xMove - xDown;
int dy = yMove - yDown;
/**
* 判断是否是从右到左的滑动
*/
if (xMove < xDown && Math.abs(dx) > touchSlop && Math.abs(dy) < touchSlop)
{
// Log.e(TAG, "touchslop = " + touchSlop + " , dx = " + dx +
// " , dy = " + dy);
isSliding = true;
}
break;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
int action = ev.getAction();
/**
* 如果是从右到左的滑动才相应
*/
if (isSliding)
{
switch (action)
{
case MotionEvent.ACTION_MOVE:
int[] location = new int[2];
// 获得当前item的位置x与y
mCurrentView.getLocationOnScreen(location);
// 设置popupWindow的动画
mPopupWindow.setAnimationStyle(R.style.popwindow_delete_btn_anim_style);
mPopupWindow.update();
mPopupWindow.showAtLocation(mCurrentView, Gravity.LEFT | Gravity.TOP,
location[0] + mCurrentView.getWidth(), location[1] + mCurrentView.getHeight() / 2
- mPopupWindowHeight / 2);
// 设置删除按钮的回调
mDelBtn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
if (mListener != null)
{
mListener.clickHappend(mCurrentViewPos);
mPopupWindow.dismiss();
}
}
});
// Log.e(TAG, "mPopupWindow.getHeight()=" + mPopupWindowHeight);
break;
case MotionEvent.ACTION_UP:
isSliding = false;
}
// 相应滑动期间屏幕itemClick事件,避免发生冲突
return true;
}
return super.onTouchEvent(ev);
}
/**
* 隐藏popupWindow
*/
private void dismissPopWindow()
{
if (mPopupWindow != null && mPopupWindow.isShowing())
{
mPopupWindow.dismiss();
}
}
public void setDelButtonClickListener(DelButtonClickListener listener)
{
mListener = listener;
}
public interface DelButtonClickListener
{
public void clickHappend(int position);
}
}
DeleteStaffActivity .java
package com.rjxy.activity;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.rjxy.bean.Staff;
import com.rjxy.path.Path;
import com.rjxy.util.StreamTools;
import com.rjxy.view.DeleteListView;
import com.rjxy.view.DeleteListView.DelButtonClickListener;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class DeleteStaffActivity extends Activity {
private static final int CHANGE_UI = 1;
private static final int DELETE = 3;
private static final int SUCCESS = 2;
private static final int ERROR = 0;
private DeleteListView lv;
private ArrayAdapter<String> mAdapter;
private List<String> staffs = new ArrayList<String>();
private Staff staff;
String sno;
// 主线程创建消息处理器
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if (msg.what == CHANGE_UI) {
try {
JSONArray arr = new JSONArray((String) msg.obj);
for (int i = 0; i < arr.length(); i++) {
JSONObject temp = (JSONObject) arr.get(i);
staff = new Staff();
staff.setSno(temp.getString("sno"));
staff.setSname(temp.getString("sname"));
staff.setDname(temp.getString("d_name"));
staffs.add("员工号:" + staff.getSno() + "\n姓 名:"
+ staff.getSname() + "\n部 门:" + staff.getDname());
}
mAdapter = new ArrayAdapter<String>(
DeleteStaffActivity.this,
android.R.layout.simple_list_item_1, staffs);
lv.setAdapter(mAdapter);
lv.setDelButtonClickListener(new DelButtonClickListener() {
@Override
public void clickHappend(final int position) {
String s = mAdapter.getItem(position);
String[] ss = s.split("\n");
String snos = ss[0];
String[] sss = snos.split(":");
sno = sss[1];
delete();
mAdapter.remove(mAdapter.getItem(position));
}
});
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
Toast.makeText(
DeleteStaffActivity.this,
position + " : "
+ mAdapter.getItem(position), 0)
.show();
}
});
} catch (JSONException e) {
e.printStackTrace();
}
} else if (msg.what == DELETE) {
Toast.makeText(DeleteStaffActivity.this, (String) msg.obj, 1)
.show();
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lookstaff);
lv = (DeleteListView) findViewById(R.id.id_listview);
select();
}
private void select() {
// 子线程更新UI
new Thread() {
public void run() {
try {
// 区别1、url的路径不同
URL url = new URL(Path.lookStaffPath);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 区别2、请求方式post
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent",
"Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)");
// 区别3、必须指定两个请求的参数
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");// 请求的类型 表单数据
String data = "";
conn.setRequestProperty("Content-Length", data.length()
+ "");// 数据的长度
// 区别4、记得设置把数据写给服务器
conn.setDoOutput(true);// 设置向服务器写数据
byte[] bytes = data.getBytes();
conn.getOutputStream().write(bytes);// 把数据以流的方式写给服务器
int code = conn.getResponseCode();
System.out.println(code);
if (code == 200) {
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
Message mas = Message.obtain();
mas.what = CHANGE_UI;
mas.obj = result;
handler.sendMessage(mas);
} else {
Message mas = Message.obtain();
mas.what = ERROR;
handler.sendMessage(mas);
}
} catch (IOException e) {
// TODO Auto-generated catch block
Message mas = Message.obtain();
mas.what = ERROR;
handler.sendMessage(mas);
}
}
}.start();
}
private void delete() {
// 子线程更新UI
new Thread() {
public void run() {
try {
// 区别1、url的路径不同
URL url = new URL(Path.deleteStaffPath);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 区别2、请求方式post
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent",
"Mozilla/5.0(compatible;MSIE 9.0;Windows NT 6.1;Trident/5.0)");
// 区别3、必须指定两个请求的参数
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");// 请求的类型 表单数据
String data = "sno=" + sno;
conn.setRequestProperty("Content-Length", data.length()
+ "");// 数据的长度
// 区别4、记得设置把数据写给服务器
conn.setDoOutput(true);// 设置向服务器写数据
byte[] bytes = data.getBytes();
conn.getOutputStream().write(bytes);// 把数据以流的方式写给服务器
int code = conn.getResponseCode();
System.out.println(code);
if (code == 200) {
InputStream is = conn.getInputStream();
String result = StreamTools.readStream(is);
Message mas = Message.obtain();
mas.what = DELETE;
mas.obj = result;
handler.sendMessage(mas);
} else {
Message mas = Message.obtain();
mas.what = ERROR;
handler.sendMessage(mas);
}
} catch (IOException e) {
// TODO Auto-generated catch block
Message mas = Message.obtain();
mas.what = ERROR;
handler.sendMessage(mas);
}
}
}.start();
}
}
以上所述是小编给大家介绍的Android滑动删除数据功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# android
# 滑动删除
# Android开发中模仿qq列表信息滑动删除功能
# Android 滑动监听RecyclerView线性流+左右划删除+上下移动
# Android仿腾讯QQ实现滑动删除 附源码下载
# Android RecyclerView滑动删除和拖动排序
# Android实现ListView左右滑动删除和编辑
# Android App中ListView仿QQ实现滑动删除效果的要点解析
# 按下
# 是从
# 表单
# 回调
# 小编
# 我想
# 大家都
# 在此
# 见过
# 我把
# 跟我
# 给大家
# 上看
# 提供一个
# 所述
# 先看
# 给我留言
# 俗话说
# 很熟悉
# 感谢大家
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Linux系统命令中screen命令详解
如何用PHP快速搭建高效网站?分步指南
5种Android数据存储方式汇总
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
nginx修改上传文件大小限制的方法
如何在阿里云虚拟主机上快速搭建个人网站?
如何确保西部建站助手FTP传输的安全性?
Linux网络带宽限制_tc配置实践解析【教程】
javascript基本数据类型及类型检测常用方法小结
桂林网站制作公司有哪些,桂林马拉松怎么报名?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
Windows Hello人脸识别突然无法使用
Python结构化数据采集_字段抽取解析【教程】
详解CentOS6.5 安装 MySQL5.1.71的方法
Laravel如何实现模型的全局作用域?(Global Scope示例)
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
高防服务器租用如何选择配置与防御等级?
实例解析Array和String方法
利用JavaScript实现拖拽改变元素大小
Laravel如何使用Livewire构建动态组件?(入门代码)
JS实现鼠标移上去显示图片或微信二维码
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】
常州企业网站制作公司,全国继续教育网怎么登录?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
黑客如何利用漏洞与弱口令入侵网站服务器?
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
浅析上传头像示例及其注意事项
详解Android中Activity的四大启动模式实验简述
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
如何用景安虚拟主机手机版绑定域名建站?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Python图片处理进阶教程_Pillow滤镜与图像增强
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
javascript基于原型链的继承及call和apply函数用法分析
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何用美橙互联一键搭建多站合一网站?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】

