首页 > 系统 > Android > 正文

Android滑动删除数据功能的实现代码

2019-12-12 03:58:32
字体:
来源:转载
供稿:网友

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

我想这个效果大家都很熟悉吧。是不是在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滑动删除数据功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表