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

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

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

(0)

相关推荐

  • Android开发中模仿qq列表信息滑动删除功能

    这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuView 在手指移动的时候同时改变这两个视图的位置 重写listview 判断item向左还是向右滑动 正常的滚动还是左右滑动等等 重写onTouchEvent 进行事件分发 大致思路: listview进行事件分发,判断需要滑动还是滚动等状态,如果需要滑动将事件传递给item进行滑动处理. 在item

  • Android App中ListView仿QQ实现滑动删除效果的要点解析

    本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示.但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制.所以决定继承ListView然后结合PopupWindow. 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=

  • Android仿腾讯QQ实现滑动删除 附源码下载

    看了很多大神们的文章,感觉受益良多,也非常欣赏大家的分享态度,所以决定开始写Blog,给大家分享自己的心得. 先看看效果图: 本来准备在ListView的每个Item的布局上设置一个隐藏的Button,当滑动的时候显示.但是因为每次只要存在一个Button,发现每个Item上的Button相互间不好控制.所以决定继承ListView然后结合PopupWindow. 首先是布局文件: delete_btn.xml:这里只需要一个Button <?xml version="1.0"

  • Android实现ListView左右滑动删除和编辑

    有时候,为了实现项目中的需求,完成设计好的用户交互体验,不的不把这些View重新改造成自己想要的效果. Android原生的ListView是不支持左右滑动的,但是看到微信电话本上,联系人可以左右滑动进行操作的,就通过自己的设想和思路,并加以实现了. 思路: 1.获取到手指放到屏幕时的x,y位置,并判断点击的处于ListView的那个position. 2.判断滑动的方向,如果是上下方向,touch事件就交给ListView处理:如果是左右方向,就禁止ListView进行滑动. 3.根据手指的移

  • Android RecyclerView滑动删除和拖动排序

    本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了.RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对Item进行一些手势操作.另外,因为Design库的推出大大方便我们编写带有Material风格的App,而ListView是不兼容这个库的,比如滑动的相互协调,只有RecyclerView能做到. 先看本篇内容的效果图: 效果内容主

  • Android 滑动监听RecyclerView线性流+左右划删除+上下移动

    废话不多说了,直接给大家贴代码了.具体代码如下所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_wid

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

    今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. activity_lookstaff.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co

  • Android实现商城购物车功能的实例代码

    最近公司项目做商城模块,需要实现购物车功能,主要实现了单选.全选,金额合计,商品删除,商品数量加减等功能,先看看效果图: 在这里插入图片描述 一.实现步骤: 0.添加依赖库 1.购物车主界面布局文件(activity_main.xml) 2.购物车实现逻辑主界面(MainActivity.class) 3.使用ExpandableListView,继承BaseExpandableListAdapter 4.购物车数据的bean类(ShoppingCarDataBean.class) 5.分店铺实

  • PHP+JS实现批量删除数据功能示例

    本文实例讲述了PHP+JS实现批量删除数据功能.分享给大家供大家参考,具体如下: 表单 <form id="form2" name="form2" method="post" action="del_product.php" onsubmit="return checkF(this)"> <label> <input type="checkbox" name

  • 基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能

    建议有js基础,了解jquery,thinkphp,废话不说多下面就上代码 <----HTML----> //thinkphp循环显示把data里fid赋予多选框 <volist name="data" id="vo"> <tr> <td><input type="checkbox" value="{$vo.fid}"/></td>//可在后面加td输入参

  • Ajax+PHP实现的删除数据功能示例

    本文实例讲述了Ajax+PHP实现的删除数据功能.分享给大家供大家参考,具体如下: 一 代码 conn.php: <?php $conn = mysql_connect("localhost", "root", " ") or die("连接数据库服务器失败!".mysql_error()); //连接MySQL服务器 mysql_select_db("db_database27",$conn); /

  • 微信小程序使用scroll-view标签实现自动滑动到底部功能的实例代码

    具体代码如下所示: // 1.scroll-y="true" Y轴滚动 // 2.应该是设置了高才能行 // 3.使用scroll-top属性实现滚动到底部,scroll-top不要带单位 <scroll-view scroll-y="true" style="height:{{height-50}}px;" scroll-top="{{scrollTop}}"> <block wx:for="{{

  • jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)

    效果图 第一步:加载 <script src="js/jquery.min.js"></script> <script src="js/jquery.mobile-1.3.2.min.js"></script> 第二步:html <div class="item-wrap"> <div class="item clearfix"> <div clas

  • Android添加指纹解锁功能的实现代码

    前言 指纹解锁技术成为当前验证用户信息的重要手段,基本上当前手机都配置了指纹解锁.当开发的APP需要加密验证时可以考虑添加系统指纹解锁功能. 添加指纹解锁功能步骤很简单,大致过程如下: 1 添加权限 在Manifest.xml文件中添加访问用户指纹的权限. <uses-permission android:name="android.permission.USE_FINGERPRINT"/> 2 声明系统提供的指纹管理类对象 private FingerprintManag

  • Android 购物车加减功能的实现代码

    Android 实现购物车加减功能,效果图如下所示: public class adderView extends LinearLayout implements View.OnClickListener, TextWatcher { private int amount = 0; //购买数量 private int goods_storage = Integer.MAX_VALUE; //商品库存 private OnAmountChangeListener mListener; priva

  • Android实现强制下线功能的示例代码

    一.回顾 上次连载写了两个类,一个类ActivityCollector.java用于管理所有的活动:一个类是BaseActivity.java作为所有活动的父类: 还有一个放在layout目录中的登录界面login.xml 二.登录页面的活动 接下来写一个登录页面的活动,继承自BaseActivity.java package com.example.broadcastbestpractice; import android.content.Intent; import android.os.B

随机推荐