android中列表的滑動刪除仿ios滑動刪除
大家是不是覺得ios列表的滑動刪除效果很酷炫?不用羨慕android也可以實現相同的效果
并且可以自定義效果,比如左滑刪除,置頂,收藏,分享等等
其實就是自定義listview重寫listview方法。廢話不多少說,上干貨:
這是封裝好的listview重寫方法
1 import android.content.Context;
2 import android.util.AttributeSet;
3 import android.util.TypedValue;
4 import android.view.MotionEvent;
5 import android.view.View;
6 import android.view.animation.Interpolator;
7 import android.widget.ListAdapter;
8 import android.widget.ListView;
9
10
14 public class SwipeMenuListView extends ListView {
15
16 private static final int TOUCH_STATE_NONE = 0;
17 private static final int TOUCH_STATE_X = 1;
18 private static final int TOUCH_STATE_Y = 2;
19
20 public static final int DIRECTION_LEFT = 1;
21 public static final int DIRECTION_RIGHT = -1;
22 private int mDirection = 1;//swipe from right to left by default
23
24 private int MAX_Y = 5;
25 private int MAX_X = 3;
26 private float mDownX;
27 private float mDownY;
28 private int mTouchState;
29 private int mTouchPosition;
30 private SwipeMenuLayout mTouchView;
31 private OnSwipeListener mOnSwipeListener;
32
33 private SwipeMenuCreator mMenuCreator;
34 private OnMenuItemClickListener mOnMenuItemClickListener;
35 private OnMenuStateChangeListener mOnMenuStateChangeListener;
36 private Interpolator mCloseInterpolator;
37 private Interpolator mOpenInterpolator;
38
39 public SwipeMenuListView(Context context) {
40 super(context);
41 init();
42 }
43
44 public SwipeMenuListView(Context context, AttributeSet attrs, int defStyle) {
45 super(context, attrs, defStyle);
46 init();
47 }
48
49 public SwipeMenuListView(Context context, AttributeSet attrs) {
50 super(context, attrs);
51 init();
52 }
53
54 private void init() {
55 MAX_X = dp2px(MAX_X);
56 MAX_Y = dp2px(MAX_Y);
57 mTouchState = TOUCH_STATE_NONE;
58 }
59
60 @Override
61 public void setAdapter(ListAdapter adapter) {
62 super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) {
63 @Override
64 public void createMenu(SwipeMenu menu) {
65 if (mMenuCreator != null) {
66 mMenuCreator.create(menu);
67 }
68 }
69
70 @Override
71 public void onItemClick(SwipeMenuView view, SwipeMenu menu,
72 int index) {
73 boolean flag = false;
74 if (mOnMenuItemClickListener != null) {
75 flag = mOnMenuItemClickListener.onMenuItemClick(
76 view.getPosition(), menu, index);
77 }
78 if (mTouchView != null && !flag) {
79 mTouchView.smoothCloseMenu();
80 }
81 }
82 });
83 }
84
85 public void setCloseInterpolator(Interpolator interpolator) {
86 mCloseInterpolator = interpolator;
87 }
88
89 public void setOpenInterpolator(Interpolator interpolator) {
90 mOpenInterpolator = interpolator;
91 }
92
93 public Interpolator getOpenInterpolator() {
94 return mOpenInterpolator;
95 }
96
97 public Interpolator getCloseInterpolator() {
98 return mCloseInterpolator;
99 }
100
101 @Override
102 public boolean onInterceptTouchEvent(MotionEvent ev) {
103 return super.onInterceptTouchEvent(ev);
104 }
105
106 @Override
107 public boolean onTouchEvent(MotionEvent ev) {
108 if (ev.getAction() != MotionEvent.ACTION_DOWN && mTouchView == null)
109 return super.onTouchEvent(ev);
110 int action = ev.getAction();
111 switch (action) {
112 case MotionEvent.ACTION_DOWN:
113 int oldPos = mTouchPosition;
114 mDownX = ev.getX();
115 mDownY = ev.getY();
116 mTouchState = TOUCH_STATE_NONE;
117
118 mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
119
120 if (mTouchPosition == oldPos && mTouchView != null
121 && mTouchView.isOpen()) {
122 mTouchState = TOUCH_STATE_X;
123 mTouchView.onSwipe(ev);
124 return true;
125 }
126
127 View view = getChildAt(mTouchPosition - getFirstVisiblePosition());
128
129 if (mTouchView != null && mTouchView.isOpen()) {
130 mTouchView.smoothCloseMenu();
131 mTouchView = null;
132 // return super.onTouchEvent(ev);
133 // try to cancel the touch event
134 MotionEvent cancelEvent = MotionEvent.obtain(ev);
135 cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
136 onTouchEvent(cancelEvent);
137 if (mOnMenuStateChangeListener != null) {
138 mOnMenuStateChangeListener.onMenuClose(oldPos);
139 }
140 return true;
141 }
142 if (view instanceof SwipeMenuLayout) {
143 mTouchView = (SwipeMenuLayout) view;
144 mTouchView.setSwipeDirection(mDirection);
145 }
146 if (mTouchView != null) {
147 mTouchView.onSwipe(ev);
148 }
149 break;
150 case MotionEvent.ACTION_MOVE:
151 float dy = Math.abs((ev.getY() - mDownY));
152 float dx = Math.abs((ev.getX() - mDownX));
153 if (mTouchState == TOUCH_STATE_X) {
154 if (mTouchView != null) {
155 mTouchView.onSwipe(ev);
156 }
157 getSelector().setState(new int[]{0});
158 ev.setAction(MotionEvent.ACTION_CANCEL);
159 super.onTouchEvent(ev);
160 return true;
161 } else if (mTouchState == TOUCH_STATE_NONE) {
162 if (Math.abs(dy) > MAX_Y) {
163 mTouchState = TOUCH_STATE_Y;
164 } else if (dx > MAX_X) {
165 mTouchState = TOUCH_STATE_X;
166 if (mOnSwipeListener != null) {
167 mOnSwipeListener.onSwipeStart(mTouchPosition);
168 }
169 }
170 }
171 break;
172 case MotionEvent.ACTION_UP:
173 if (mTouchState == TOUCH_STATE_X) {
174 if (mTouchView != null) {
175 boolean isBeforeOpen = mTouchView.isOpen();
176 mTouchView.onSwipe(ev);
177 boolean isAfterOpen = mTouchView.isOpen();
178 if (isBeforeOpen != isAfterOpen && mOnMenuStateChangeListener != null) {
179 if (isAfterOpen) {
180 mOnMenuStateChangeListener.onMenuOpen(mTouchPosition);
181 } else {
182 mOnMenuStateChangeListener.onMenuClose(mTouchPosition);
183 }
184 }
185 if (!isAfterOpen) {
186 mTouchPosition = -1;
187 mTouchView = null;
188 }
189 }
190 if (mOnSwipeListener != null) {
191 mOnSwipeListener.onSwipeEnd(mTouchPosition);
192 }
193 ev.setAction(MotionEvent.ACTION_CANCEL);
194 super.onTouchEvent(ev);
195 return true;
196 }
197 break;
198 }
199 return super.onTouchEvent(ev);
200 }
201
202 public void smoothOpenMenu(int position) {
203 if (position >= getFirstVisiblePosition()
204 && position <= getLastVisiblePosition()) {
205 View view = getChildAt(position - getFirstVisiblePosition());
206 if (view instanceof SwipeMenuLayout) {
207 mTouchPosition = position;
208 if (mTouchView != null && mTouchView.isOpen()) {
209 mTouchView.smoothCloseMenu();
210 }
211 mTouchView = (SwipeMenuLayout) view;
212 mTouchView.setSwipeDirection(mDirection);
213 mTouchView.smoothOpenMenu();
214 }
215 }
216 }
217
218 public void smoothCloseMenu(){
219 if (mTouchView != null && mTouchView.isOpen()) {
220 mTouchView.smoothCloseMenu();
221 }
222 }
223
224 private int dp2px(int dp) {
225 return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
226 getContext().getResources().getDisplayMetrics());
227 }
228
229 public void setMenuCreator(SwipeMenuCreator menuCreator) {
230 this.mMenuCreator = menuCreator;
231 }
232
233 public void setOnMenuItemClickListener(
234 OnMenuItemClickListener onMenuItemClickListener) {
235 this.mOnMenuItemClickListener = onMenuItemClickListener;
236 }
237
238 public void setOnSwipeListener(OnSwipeListener onSwipeListener) {
239 this.mOnSwipeListener = onSwipeListener;
240 }
241
242 public void setOnMenuStateChangeListener(OnMenuStateChangeListener onMenuStateChangeLi stener) {
243 mOnMenuStateChangeListener = onMenuStateChangeListener;
244 }
245
246 public static interface OnMenuItemClickListener {
247 boolean onMenuItemClick(int position, SwipeMenu menu, int index);
248 }
249
250 public static interface OnSwipeListener {
251 void onSwipeStart(int position);
252
253 void onSwipeEnd(int position);
254 }
255
256 public static interface OnMenuStateChangeListener {
257 void onMenuOpen(int position);
258
259 void onMenuClose(int position);
260 }
261
262 public void setSwipeDirection(int direction) {
263 mDirection = direction;
264 }
265 } 上面是自定義listview,下面叫大家怎么使用
在xml文件中需要使用listview方法時,不要直接用<listview/>改用<xxx.xx.xx.swipemenulistview.SwipeMenuListView
android:id="@+id/lv_my_case"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>前面xx是自己的包名例如cn.sy.gdxz
這只是準備工作,真正的業務操作在下面
private void initSlide() {
// TODO Auto-generated method stub
// step 1. 創建實例
SwipeMenuCreator creator = new SwipeMenuCreator() {
@SuppressLint("ResourceAsColor")
@Override
public void create(SwipeMenu menu) {
LogUtils.v("SwipeMenuCreator==create");
SwipeMenuItem deleteItem = new SwipeMenuItem(
getApplicationContext());
deleteItem.setBackground(new ColorDrawable(Color.rgb(0xF9,
0x3F, 0x25)));
// set item width
deleteItem.setWidth(dp2px(90));
// set a icon圖標
deleteItem.setIcon(R.drawable.ic_delete);
//set a 標題
deleteItem.setTitle("刪除");
deleteItem.setTitleSize(18);
deleteItem.setTitleColor(getResources().getColor(R.color.white));
// add to menu
menu.addMenuItem(deleteItem);
}
};
// set creator
lv_my_case.setMenuCreator(creator);
// step 2. listener item 點擊事件
lv_my_case.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
LogUtils.v("onMenuItemClick==position="+position+"index=="+index);
switch (index) {
case 0://
// open處理滑動事件
//處理滑動處理的第一個事件,比如刪除break;
case 1:
//這里處理滑動出來的第二項比如收藏,置頂等等
break;
}
return false;
}
});
// set SwipeListener
lv_my_case.setOnSwipeListener(new SwipeMenuListView.OnSwipeListener() {
@Override
public void onSwipeStart(int position) {
// swipe start
LogUtils.v("onSwipeEnd+"+position);
}
@Override
public void onSwipeEnd(int position) {
// swipe end
LogUtils.v("onSwipeEnd"+position);
}
});
// set MenuStateChangeListener
lv_my_case.setOnMenuStateChangeListener(new SwipeMenuListView.OnMenuStateChangeListener() {
@Override
public void onMenuOpen(int position) {
LogUtils.v("onMenuOpen"+position);
}
@Override
public void onMenuClose(int position) {
LogUtils.v("onMenuClose"+position);
}
});
}
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
getResources().getDisplayMetrics());
}
到這里滑動刪除就分享完了。只是記錄一下學習狀態,不足之處大家互相交流,互相學習
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!