滑动删除简单实用,现在大多数App都会用的功能,可是Android并不像I OS那样拖过来就能用。对于新手来说还是得死很多脑细胞的。就像我,试了很多方法,可是效果总是达不到要求。没办法既然项目要求,就得干啊!多亏前辈们留下的资源丰富,总算让我磨出来了,嘿嘿!
废话也不说了,代码直接撸起!
首先自定义SlideDeleteView继承ListView
public class SlideDeleteView extends ListView{
/**PopupWindow 加载删除按钮*/
private PopupWindow mPopupWindow;
private int mPopupWindowHeight;
private Button mDelBtn;
/** 滑动的最小距离 */
private int minDistance;
/** 是否是滑动状态*/
private boolean isSliding;
/**手指按下时的x坐标 */
private int downX;
/**手指按下时的y坐标*/
private int downY;
/** 手指移动时的x坐标*/
private int moveX;
/** 手指移动时的y坐标 */
private int moveY;
/* 为删除按钮提供一个回调接口*/
private DelButtonClickListener mListener;
/**当前手指触摸的View*/
private View mCurrentView;
/** 当前按下的位置 */
private int mCurrentViewPos;
/**
* 构造函数
* 初始化一些必要的数据
*/
public SlideDeleteView(Context context, AttributeSet attrs) {
super(context, attrs);
minDistance=ViewConfiguration.get(context).getScaledTouchSlop();
Viewview=LayoutInflater.from(context).
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 event){
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
downY = (int) event.getY();
/**
* 如果当前popupWindow显示,则直接隐藏,然后屏蔽ListView的
* touch事件的下传
*/
if (mPopupWindow.isShowing()){
dismissPopWindow();
return false;
}
// 获得当前手指按下时的item的位置
mCurrentViewPos = pointToPosition(downX, downY);
// 获得当前手指按下时的item
if(mCurrentViewPos <0){//没有点击到item,默认最后一个,也可以设置成当前不是在滑动状态
mCurrentView =getChildAt(getLastVisiblePosition());
}else{
View view = getChildAt(mCurrentViewPos -
getFirstVisiblePosition());
mCurrentView = view;
}
break;
case MotionEvent.ACTION_MOVE:
moveX = (int) event.getX();
moveY = (int) event.getY();
int dx = moveX - downX;
int dy = moveY - downY;
/**
* 判断是否是从右到左的滑动
*/
if (moveX < downX && Math.abs(dx) > minDistance
&&Math.abs(dy) < minDistance){
isSliding = true;
}
break;
}
return super.dispatchTouchEvent(event);
}
@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.btn_delete_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();
}
}
});
break;
case MotionEvent.ACTION_UP:
isSliding = false;
break;
}
// 相应滑动期间屏幕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;
}
/**button的回调接口*/
public interface DelButtonClickListener{
public void clickHappend(int position);
}
}
这样就把滑动删除的自定义ListView完成了;下面看看怎么在activity中使用的代码,
xml就当做listview使用代码就不贴了,看下activity中的代码
public class MainActivity extends Activity {
private SlideDeleteView deleteView;
private MyAdapter mAdapter;
private List<Persion> mDatas=new ArrayList<Persion>();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
deleteView = (SlideDeleteView) findViewById(R.id.slideDeleteView);
initDate();
mAdapter =new MyAdapter(this, mDatas);
deleteView.setAdapter(mAdapter);
deleteView.setDelButtonClickListener(new DelButtonClickListener()
{
@Override
public void clickHappend(final int position){
mDatas.remove(position);
mAdapter.notifyDataSetChanged();
}
});
deleteView.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> prent, View view,
int position,long id) {
//处理点击Item事件
}
});
}
/**
* 初始化数据
*/
private void initDate() {
Persion persion1=new Persion("张哈哈", "男", "11111");
mDatas.add(persion1);
Persion persion2=new Persion("李乐乐", "女", "22222");
mDatas.add(persion2);
Persion persion3=new Persion("王宝宝", "男", "333333");
mDatas.add(persion3);
Persion persion4=new Persion("赵欢欢", "女", "444444");
mDatas.add(persion4);
Persion persion5=new Persion("孙青青", "男", "555555");
mDatas.add(persion5);
Persion persion6=new Persion("刘哒哒", "男", "666666");
mDatas.add(persion6);
}
class MyAdapter extends BaseAdapter{
private Context context;
private List<Persion> date=new ArrayList<Persion>();
public MyAdapter(Context context, List<Persion> data) {
super();
this.context=context;
this.date=data;
}
@Override
public int getCount() {
return date.size();
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int arg0) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
holder=new ViewHolder();
LayoutInflater Inflate= (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
convertView=Inflate.inflate(R.layout.item_name_list, null);
holder.tv_Name=(TextView)convertView.findViewById(R.id.tv_Name);
holder.tv_Sex=(TextView)convertView.findViewById(R.id.tv_Sex);
holder.tv_Phone=(TextView)convertView.findViewById(R.id.tv_Phone);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
holder.tv_Name.setText(date.get(position).getName());
holder.tv_Sex.setText(date.get(position).getSex());
holder.tv_Phone.setText(date.get(position).getPhone());
return convertView;
}
class ViewHolder{
TextView tv_Name;
TextView tv_Sex;
TextView tv_Phone;
}
}
欧了,全部搞定,还有比这简单的吗?布局就不贴了,都太简单了,咱就不献丑,呵呵!看看效果如何