Android开发中如何实现一个滑动删除功能
这篇文章将为大家详细讲解有关Android开发中如何实现一个滑动删除功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了宣化免费建站欢迎大家使用!
先看一下效果
activity_lookstaff.xml
delete_btn.xml
<?xml version="1.0" encoding="utf-8"?>
d_delete_btn.xml
<?xml version="1.0" encoding="utf-8"?>
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 ArrayAdaptermAdapter; private List staffs = new ArrayList (); 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 ( 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开发中如何实现一个滑动删除功能
网站网址:http://azwzsj.com/article/pidgce.html