1. 程式人生 > >Android列表側滑刪除就是這麼簡單

Android列表側滑刪除就是這麼簡單

public class DragListItem extends LinearLayout { private Context mContext; private View mHidenDragView; private LinearLayout mContentView;//將包裹實際的內容 private LinearLayout mHidenLayout; private Scroller mScroller; private int mLastX, mLastY; private int mDragOutWidth;//完全側滑出來的距離 private double
mfraction = 0.75;//觸發自動側滑的臨界點 private boolean isDrag = false; public DragListItem(Context context) { super(context); mContext = context; initView(); } public DragListItem(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; initView(); } private void
initView() { setOrientation(HORIZONTAL); //merge進來整個listItem,在這裡可以自己定義刪除按鈕的顯示的佈局,隨便按照的喜好修改都行 mHidenDragView = View.inflate(mContext, R.layout.hide_drag_item, this); mContentView = (LinearLayout) mHidenDragView.findViewById(R.id.show_content_view); mHidenLayout = (LinearLayout) mHidenDragView.findViewById(R.id.hide_view
); mScroller = new Scroller(mContext); //將隱藏的刪除佈局的寬度賦值給邊界的值,根據自己的需要可以任意的修改 mDragOutWidth = dip2px(mContext, 120); } public static int dip2px(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } /** * 根據傳遞進來的事件,在此進行側滑邏輯的判斷,從而實現側滑時刪除按鈕滑出的效果功能 */ public void onDragTouchEvent(MotionEvent event) { if (isDrag) {//手指在橫向滑動時設定條目不可點選 setClickable(false); } else { setClickable(true); } int x = (int) event.getX(); int y = (int) event.getY(); int scrollX = getScrollX();//手機螢幕左上角x軸的值 - view的左上角x軸的值 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!mScroller.isFinished()) { mScroller.abortAnimation(); } break; case MotionEvent.ACTION_MOVE: hsaMove = true; int deltaX = x - mLastX; int deltaY = y - mLastY; //縱向的滑動大於橫向的滑動時是不處罰側滑效果的 // 此處的加上100是為了讓條目的側滑更容易觸發,根據自己的需要可以調整該值 if (Math.abs(deltaX) + 100 < Math.abs(deltaY)) { break; } if (deltaX != 0) {//手指正在橫向滑動 isDrag = true; int newScrollX = scrollX - deltaX;//當這個值變小時,view檢視向左滑動 if (newScrollX < 0) {//保持大於等於0,等於0時view左上角x值和螢幕左上角x值重合 newScrollX = 0; setClickable(true); } else if (newScrollX > mDragOutWidth) {//當到達隱藏佈局的邊界時 是不能再側滑了 newScrollX = mDragOutWidth; } scrollTo(newScrollX, 0); } break; case MotionEvent.ACTION_UP: hsaMove = false; default: int finalScrollX = 0; //左滑到足夠自動滑動的位置時可以自動滑出刪除佈局 // ,否則就自動回縮隱藏刪除佈局 if (scrollX > mDragOutWidth * mfraction) { finalScrollX = mDragOutWidth; autoScrollToX(finalScrollX, 500); } else { rollBack(); isDrag = false; } break; } mLastX = x; mLastY = y; } private boolean hsaMove = false;//該條目是否已經監聽過手勢的滑動,用來作為判斷是否進行條目左右滑動的條件之一public boolean isHsaMove() { return hsaMove; } public void setHsaMove(boolean hsaMove) { this.hsaMove = hsaMove; } public void setIsDrag(boolean isDrag) { this.isDrag = isDrag; } /** * 自動回滾到封閉狀態 */ public void rollBack() { if (getScrollX() != 0) { autoScrollToX(0, 100); new Handler().postDelayed(new Runnable() { public void run() { setClickable(true); isDrag = false;//將狀態置為false,沒有側滑出 hsaMove = false;//狀態重置後將是否滑動過置為沒有滑動過 } }, 10); } } private void autoScrollToX(int finalX, int duration) { mScroller.startScroll(getScrollX(), 0, finalX - getScrollX(), 0, duration); invalidate(); } public boolean getDragState() { return isDrag; } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } /** * 更改隱藏頁的文字*/ public void setFirstHidenView(CharSequence charSequence) { TextView textView = (TextView) mHidenLayout.findViewById(R.id.hide_delete); textView.setText(charSequence); } /** * 給使用者新增隱藏頁的檢視(不僅僅是刪除)*/ public void addHidenView(TextView view) { mHidenLayout.addView(view); } /** * 給使用者設定listItem的實際內容*/ public void setContentView(View view) { mContentView.addView(view); } public double getMfraction() { return mfraction; } public void setMfraction(double mfraction) { this.mfraction = mfraction; } }