今天学习了新的功能那就是滑动删除数据。先看一下效果

我想这个效果大家都很熟悉吧。是不是在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滑动删除功能的更多相关文章

  1. 自定义listView添加滑动删除功能

    今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个 ...

  2. Android学习之ItemTouchHelper实现RecylerView的拖拽以及滑动删除功能

    今天在群里见大神们提到控件的拖动以及滑动删除的效果实现,就在网上找了资料ItemTouchHelper学习,并实现其功能.不胜窃喜之至,忍不住跟大家分享一下,如今就对学习过程做下简介.帮助大家实现这样 ...

  3. android 继承ListView实现滑动删除功能.

    在一些用户体验较好的应用上,可以经常遇见   在ListView中  向左或向右滑动便可删除那一项列表. 具体实现  则是继承ListView实现特定功能即可. (1). 新建 delete_butt ...

  4. RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能

    RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...

  5. RecyclerView实现拖动排序和滑动删除功能

    RecyclerView 的拖动排序需要借助一下 ItemTouchHelper 这个类,ItemTouchHelper 类是 Google 提供的一个支持 RecyclerView 滑动和拖动的一个 ...

  6. android滑动删除的多种实现方式(一)

    个人习惯,先上图 同事是个妹子(这点很重要),写滑动删除动能的时候用到了SwipeLayout,然后悲催的是,滑动时间被拦截了,解决方法先不提,在(一)中先讲解SwipeLayout下载listvie ...

  7. Android 滑动删除控件推荐

    implementation 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.3.0' <?xml version="1.0" enc ...

  8. 安卓listView实现下拉刷新上拉加载滑动仿QQ的删除功能

    大家对这些功能都是看的多了,然后对上拉刷新和下拉加载的原理都是非常清楚的,所以实现这功能其实也就是为了让大家能够从众多的同行们来进行比较学习而已,虽然即使是这样,但是面试的时候面试官还是会问你上拉和下 ...

  9. 如何在RecyclerView上面实现"拖放"和"滑动删除"-1

    Android上面有许多的教程, 库和示例, 在RecyclerView上面实现"拖放"和"滑动删除"功能. 尽管有更新, 更好的方法可用, 但是大多数人依然使 ...

随机推荐

  1. js实现斐波那契数列

    1:递归 function fb1(n){     if(n <= 2){         return 1;        }else{         return fb1(n-1) + f ...

  2. netstat查看tcp连接的状态

    netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t",state[key]}'

  3. mysql 外键问题

    清空.删除具有外键约束的表时报ERROR 1701(42000)的解决 解决方法: 解除外键约束mysql> set foreign_key_checks=0; 删除表后添加外键约束 mysql ...

  4. C++_标准模板库STL概念介绍5-其他库与总结

    C++还提供了其他一些类库,这些类库更加专用. 例如,头文件complex为复数提供了类模板complex,包含用于float.long和long double的具体化. 这个类提供了标准的复数运算以 ...

  5. JAVA数据结构--ArrayList动态数组

    在计算机科学中,动态数组,可扩展数组,可调整数组,动态表,可变数组或数组列表是一种随机存取可变大小列表数据结构,允许添加或删除元素.它提供许多现代主流编程语言的标准库.动态数组克服了静态数组的限制,静 ...

  6. [八分之一的男人]POJ - 1743 后缀数组 height分组 带详解

    题意:求最长不可重叠的相同差值子串的长度 这道题算是拖了好几个月,现在花了点时间应该搞懂了不少,尝试分析一下 我们首先来解决一个退化的版本,求最长不可重叠的相同子串(差值为0) 比如\(aabaaba ...

  7. nginx(一)- 初识

    前言 这里呢,开始我的nginx学习记录.关于nginx是什么?为什么?有什么好处?我就不说了,说的肯定没有网上其他人说的那么细.我在这里就记录我自己学习nginx的过程.只说怎么做,让我们快速用起来 ...

  8. [转] javascript中的变量和垃圾回收

    [From] http://www.imooc.com/article/4585 基本类型和引用类型 js中的变量虽然不区分类型,但是实际上Ecmascript包含两种类型,基本类型和引用类型. 基本 ...

  9. Q680 验证回文字符串 Ⅱ

    给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: "abca" 输出: ...

  10. rm删除文件,空间没有释放

    rm删除的文件,如果其他进程正在使用这个文件,那么文件句柄并没有释放 (df仍然会统计这个文件占用的空间) 此时只能重启这个进程 正确的删除文件方法应该是 >xxx.file (最好之前加个co ...