Android滑動刪除功能

来源:http://www.cnblogs.com/kangyaping/archive/2017/01/19/6307350.html
-Advertisement-
Play Games

今天學習了新的功能那就是滑動刪除數據。先看一下效果 我想這個效果大家都很熟悉吧。是不是在qq上看見過這個效果。俗話說好記性不如賴筆頭,為了我的以後,為了跟我一樣自學的小伙伴們,我把我的代碼粘貼在下麵。 activity_lookstaff.xml delete_btn.xml d_delete_bt ...


今天學習了新的功能那就是滑動刪除數據。先看一下效果

我想這個效果大家都很熟悉吧。是不是在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();
    }

}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這是翻譯的一篇文章,原文是: "3 New CSS Features to Learn in 2017" ,翻譯的不是很好,如有疑問歡迎指出。 新的一年,我們有一系列新的東西要學習。儘管CSS有很多新的特性,但有三個特性令我最激動併進行學習。 1. Feature Queries(特性查詢) 在這之 ...
  • 今天學習的新內容是側滑導航欄,我想大家肯定都比較熟悉了,因為這個效果在qq裡面也有,最近一直跟室友們玩的游戲是快速讓自己的頭像的點贊量上千。當然我的效果跟qq是沒有辦法比的,因為那裡面的功能是在是太強大了。下麵我來展示一下我做的效果截圖。 我做的界面有點醜,但是對比之前已經是有了很大的改觀了。想做這 ...
  • 解決的辦法:在Build Settings >Aplle LLVM8.0 - Language - Objectibe-C >Weak Reference In Manual Retain Release 設置為YES。 ...
  • let systemFont = UIFont.systemFontOfSize(14)let otherFont = UIFont(descriptor: systemFont.fontDescriptor(), size: 16)以下是錯誤形式:let systemFont = UIFont.s... ...
  • 介紹 好久沒有寫博客啦,最近在接近新年了,年前的工作都要收尾,所以特別忙,周末抽空寫了個通用的載入view,寫篇博客分享出來。 功能 1、顯示載入視圖,載入失敗的時候顯示載入失敗視圖,數據為空時顯示數據為空視圖,支持為失敗視圖設置點擊事件重新載入數據。 2、支持個性化設置,自定義設置 載入、失敗、空 ...
  • 今天來到打開昨天的項目運行正常,然後改動了一點代碼編譯報錯: 把代碼改動的地方恢復還是一隻再報這個錯誤,想到了iOS開發中遇到莫名的錯誤第一步就是clean一下,重新編譯一下項目。Android Studio更好,直接有Rebuild功能(Build選項裡面),重新build項目後,錯誤消失,正常運 ...
  • 知識點: 1.UINavigationController 2.UINavigationItem 3.UINavigationBar 4.UINavigationController視圖切換 UINavigationController 1.什麼是導航控制器 作用:管理視圖控制器 2.UINavig ...
  • UITextField使用 1.創建方式 例: UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; 2.常用方法和屬性 1)邊框樣式 @property(nonatomic) UITe ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...