Android列表側滑刪除就是這麼簡單
阿新 • • 發佈:2019-01-02
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;
}
}