您好,欢迎来到源码搜藏!分享精神,快乐你我!提示:担心找不到本站?在百度搜索“源码搜藏”,网址永远不丢失!
  • 首 页
  • 在线工具
  • 当前位置:首页 > 安卓源码 > 技术博客 >

    Android滑动删除数据功能

    时间:2017-01-19 23:16 来源:互联网 作者:源码搜藏 浏览:收藏 挑错 推荐 打印

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

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

    Android滑动删除数据功能Android滑动删除数据功能Android滑动删除数据功能

    我想这个效果大家都很熟悉吧。是不是在qq上看见过这个效果。俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面。

    activity_lookstaff.xml

    Android滑动删除数据功能
    <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>
    
    
    Android滑动删除数据功能

    delete_btn.xml

    Android滑动删除数据功能
    <?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>
    Android滑动删除数据功能

    d_delete_btn.xml

    Android滑动删除数据功能
    <?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>
    Android滑动删除数据功能
    DeleteListView .java
    Android滑动删除数据功能
    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);
        }
    
    }
    Android滑动删除数据功能
    DeleteStaffActivity .java
    Android滑动删除数据功能
    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滑动删除数据功能转载http://www.codesocang.com/anzhuoyuanma/boke/34334.html
    标签:网站源码