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();
    }

}

 

posted on 2017-01-19 16:58  kang_ya_ping  阅读(1127)  评论(0编辑  收藏  举报

导航