今天學習了新的功能那就是滑動刪除數據。先看一下效果 我想這個效果大家都很熟悉吧。是不是在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(); } }