全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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


# android  # 滑动删除  # Android开发中模仿qq列表信息滑动删除功能  # Android 滑动监听RecyclerView线性流+左右划删除+上下移动  # Android仿腾讯QQ实现滑动删除 附源码下载  # Android RecyclerView滑动删除和拖动排序  # Android实现ListView左右滑动删除和编辑  # Android App中ListView仿QQ实现滑动删除效果的要点解析  # 按下  # 是从  # 表单  # 回调  # 小编  # 我想  # 大家都  # 在此  # 见过  # 我把  # 跟我  # 给大家  # 上看  # 提供一个  # 所述  # 先看  # 给我留言  # 俗话说  # 很熟悉  # 感谢大家 


相关文章: 制作表格网站有哪些,线上表格怎么弄?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  湖北网站制作公司有哪些,湖北清能集团官网?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  建站之星安装提示数据库无法连接如何解决?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  如何在云主机快速搭建网站站点?  家庭建站与云服务器建站,如何选择更优?  nginx修改上传文件大小限制的方法  英语简历制作免费网站推荐,如何将简历翻译成英文?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何用IIS7快速搭建并优化网站站点?  如何用花生壳三步快速搭建专属网站?  建站主机选购指南:核心配置与性价比推荐解析  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  如何通过山东自助建站平台快速注册域名?  如何通过VPS建站实现广告与增值服务盈利?  h5网站制作工具有哪些,h5页面制作工具有哪些?  如何在VPS电脑上快速搭建网站?  香港服务器选型指南:免备案配置与高效建站方案解析  零基础网站服务器架设实战:轻量应用与域名解析配置指南  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  C#怎么创建控制台应用 C# Console App项目创建方法  长沙企业网站制作哪家好,长沙水业集团官方网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  PHP 500报错的快速解决方法  高防服务器租用指南:配置选择与快速部署攻略  网站制作模板下载什么软件,ppt模板免费下载网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  建站主机数据库如何配置才能提升网站性能?  如何选择PHP开源工具快速搭建网站?  建站主机如何安装配置?新手必看操作指南  如何用PHP工具快速搭建高效网站?  如何通过西部数码建站助手快速创建专业网站?  如何续费美橙建站之星域名及服务?  如何选择可靠的免备案建站服务器?  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何快速启动建站代理加盟业务?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  宝华建站服务条款解析:五站合一功能与SEO优化设置指南  教学网站制作软件,学习*后期制作的网站有哪些?  建站之星如何配置系统实现高效建站?  焦点电影公司作品,电影焦点结局是什么?  开心动漫网站制作软件下载,十分开心动画为何停播?  南京网站制作费用,南京远驱官方网站?  如何零成本快速生成个人自助网站?  建站10G流量真的够用吗?如何应对访问高峰? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。