需要自定义ListView。这里就交FloatDelListView吧。

复写onTouchEvent方法。如下:

  1. @Override
  2. public boolean onTouchEvent(MotionEvent ev) {
  3. switch (ev.getAction()) {
  4. case MotionEvent.ACTION_DOWN:
              // 获取按下的条目视图(child view)
  5. int childCount = getChildCount();
  6. int[] listViewCoords = new int[2];
  7. getLocationOnScreen(listViewCoords);
  8. int x = (int) ev.getRawX() - listViewCoords[0];
  9. int y = (int) ev.getRawY() - listViewCoords[1];
  10. for (int i = 0; i < childCount; i++) {
  11. downChild = getChildAt(i); //
  12. Rect rect = new Rect();
  13. assert downChild != null;
  14. downChild.getHitRect(rect);
  15.  
  16. int childPosition = getPositionForView(downChild);
  17.  
  18. if (rect.contains(x, y)) {
  19. downX = ev.getRawX();
  20. int downPosition = childPosition;
  21.  
  22. velocityTracker = VelocityTracker.obtain();
  23. assert velocityTracker != null;
  24. velocityTracker.addMovement(ev);
  25. break;
  26. }
  27. }
  28. isSwipe = false;
  29. break;
  30. case MotionEvent.ACTION_MOVE:
  31. velocityTracker.addMovement(ev);
              // 计算水平和垂直方向移动速度
  32. velocityTracker.computeCurrentVelocity(1000);
  33. float velocityX = Math.abs(velocityTracker.getXVelocity());
  34. float velocityY = Math.abs(velocityTracker.getYVelocity());

  35.           // 水平移动距离
  36. float deltaX = ev.getRawX() - downX;
  37. float deltaMode = Math.abs(deltaX);
  38. if (deltaX > 150) {// right swipe(右滑)
  39. isSwipeToLeft = false;
  40. } else if (deltaX < -150) {// left swipe(左滑)
  41. isSwipeToLeft = true;
  42. }
              // 如果水平滑动距离大于零,并且水平滑动速率比垂直大,说明是水平滑动
  43. if (deltaMode > 0 && velocityY < velocityX) {
                // 这里的FloatDelButtonLayout是自定义的LinearLayout。
  44. ((FloatDelButtonLayout) downChild).showDelButton(ev, isSwipeToLeft);
  45. isSwipe = true;
  46. }
  47. break;
  48. case MotionEvent.ACTION_CANCEL:
  49. case MotionEvent.ACTION_UP:
  50. downChild.setSelected(false);
  51. if (isSwipe) {
  52. isSwipe = false;
  53. return true;
  54. }
  55. break;
  56. }
  57. return super.onTouchEvent(ev);
  58. }

FloatDelButtonLayou.java :

  1. public class FloatDelButtonLayout extends LinearLayout {

  2.    // 提供删除按钮的接口
  3. private OnDelListener delListener;

  4.    // 当前视图在列表中的索引,在delListener中使用
  5. private int index;

  6.    // 右滑 还是 左滑?
        private boolean isSwipeToLeft;
  7. public void setOnDelListener(OnDelListener listener, int i) {
  8. delListener = listener;
  9. index = i;
  10. }
  11.  
  12. public FloatDelButtonLayout(Context context) {
  13. super(context, null);
  14. }
  15.  
  16. public FloatDelButtonLayout(Context context, AttributeSet attrs) {
  17. super(context, attrs, 0);
  18. }
  19.  
  20. public FloatDelButtonLayout(Context context, AttributeSet attrs, int defStyle) {
  21. super(context, attrs, defStyle);
  22. }

  23.    // 用来显示或者隐藏删除按钮。
  24. public void showDelButton(MotionEvent ev, boolean isSwipeToLeft) {
  25. this.isSwipeToLeft = isSwipeToLeft;
  26. onTouchEvent(ev);
  27. }
  28.  
  29. private OnClickListener clickDel = new OnClickListener() {
  30. @Override
  31. public void onClick(View v) {
  32. delListener.onDel(index);
  33. }
  34. };

  35.    /**
        * 这里的event是我们显示的从FloatDelListView的onTouchEvent里面传进来的,
    */
  36. @Override
  37. public boolean onTouchEvent(MotionEvent event) {
  38. switch (MotionEventCompat.getActionMasked(event)) {
  39. case MotionEvent.ACTION_MOVE:
              // 获取删除按钮对象,视图layout中必须要有id为del_button的Button标签
  40. Button view = (Button) findViewById(R.id.del_button);
  41. view.setText(R.string.del);
              // 设置Button的MarginLayoutParams,当然可以做成各种动作,比如渐隐之类的显示出来。
  42. MarginLayoutParams layoutParams = (MarginLayoutParams) view.getLayoutParams();
  43. assert layoutParams != null;
  44. if (isSwipeToLeft) {
  45. view.setVisibility(View.VISIBLE);
  46. view.setOnClickListener(clickDel);
  47. layoutParams.leftMargin = -200;
  48. } else {
  49. view.setVisibility(View.GONE);
  50. layoutParams.leftMargin = 0;
  51. }
  52. view.setLayoutParams(layoutParams);
  53. invalidate();
  54. break;
  55. }
  56. return super.onTouchEvent(event);
  57. }
  58.  
  59. public interface OnDelListener {
  60. void onDel(int i);
  61. }
  62. }

完成!希望对你有帮助!

Android ListView实现仿iPhone实现左滑删除按钮的更多相关文章

  1. Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(1)

    场景: 近期做的TODO APP需要在主页添加一个功能,就是可以左滑删除,右滑完成.看了一下当前其他人做的例如仿探探式的效果,核心功能基本一样,但是和我预想的还是有少量区别,于是干脆自己重头学一遍如何 ...

  2. 仿QQ列表左滑删除

    一直想写个仿QQ通讯列表左滑删除的效果,今天终于忙里偷闲,简单一个. 大概思路是这样的: 通过 ontouchstartontouchmoveontouchend 结合css3的平移. 不多说,直接上 ...

  3. Android滑动列表(拖拽,左滑删除,右滑完成)功能实现(2)

    ItemTouchHelper类 之前我们实现了滑动列表的一些基本功能,为了实现更多的效果,我们来仔细看一下ItemTouchHelper中的类: ItemTouchHelper.SimpleCall ...

  4. Android开发学习之路-PopupWindow和仿QQ左滑删除

    这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...

  5. [转]ANDROID仿IOS微信滑动删除_SWIPELISTVIEW左滑删除例子

    转载:http://dwtedx.sinaapp.com/itshare_290.html 本例子实现了滑动删除ListView的Itemdemo的效果.大家都知道.这种创意是来源于IOS的.左滑删除 ...

  6. Android ListView左滑删除、左滑自定义功能

    最近项目需要ListView左滑删除功能,搜集了很多资料发现了一个某一前辈写的库能很简单的实现这个功能,而且有源码,直接拿来使用了. 库名字叫做SwipeMenuListView,下面给大家演示一下使 ...

  7. 类似QQ消息左滑删除的Demo

    最近在网上学到一篇类似QQ消息左滑删除的demo,完善了下代码,感觉还不错,特此分享一波: CustomSwipeListView.java 是个继承自ListView的类,里面调用了自定义View ...

  8. 模仿QQ左滑删除

    需求: 1.左滑删除 2.向左滑动距离超过一半的时候让它自动滑开,向右滑动超过一半的时候自动隐藏 3.一次只允许滑开一个item 还有,根本不需要自定义view来实现,谨防入坑 布局: <?xm ...

  9. 微信小程序实现左滑删除源码

    左滑删除效果在app的交互方式中十分流行,比如全民应用微信 微信左滑删除 再比如曾引起很大反响的效率app Clear Clear左滑删除 从技术上来说,实现这个效果并不困难,响应一下滑动操作,移动一 ...

随机推荐

  1. (转)未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService~~导出!解决方案。

    今天刚到公司,打开VS2012准备些个小程序练练手,结果打开C#控制台程序创建时弹出个出错警告,于是呼赶紧跑到百度娘那里问问. 百度一番之后,找到了两篇文章: vs2012建立c++项目为啥会这样? ...

  2. 【网络流24题】 No.15 汽车加油行驶问题 (分层图最短路i)

    [题意] 问题描述:给定一个 N*N 的方形网格,设其左上角为起点◎, 坐标为( 1, 1), X 轴向右为正, Y轴向下为正, 每个方格边长为 1, 如图所示. 一辆汽车从起点◎出发驶向右下角终点▲ ...

  3. 【网络流24题】No.8 机器人路径规划问题

    [题意] 机器人 Rob 可在一个树状路径上自由移动. 给定树状路径 T 上的起点 s 和终点 t, 机器人 Rob 要从 s 运动到 t. 树状路径 T 上有若干可移动的障碍物. 由于路径狭窄, 任 ...

  4. 在使用Ibatis查询数据返回时,报如下错误:java ibatis The error happened while setting a property on the result object

    问题: 在使用Ibatis查询数据返回时,报如下错误: [com.show.add.proxy.SqlMapClientTemplateProxy]com.ibatis.common.jdbc.exc ...

  5. 第三章 传奇的开始--Delphi(附读书笔记)

    第三章 传奇的开始--Delphi "是惊世之作的Delphi让Borland重新站了起来,没有当初的Delphi,就没有今日的Borland!" "是Turbo Pas ...

  6. Android如何在一个线性布局里完美显示两个listview啊?

    复写一个listView ,在你布局文件中使用此view: <ScrollView android:layout_width="fill_parent" android:la ...

  7. linux系统配置文件和用户配置文件及其作用

    我的博客:www.while0.com /etc/issue 未登陆时控制台显示的文字 /etc/issue.net 远程登陆时控制台显示的文字 /etc/motd 用户登陆时显示的文字 这里先提供两 ...

  8. 【HDOJ】1180 诡异的楼梯

    bfs+优先队列.wa了N次,才发现可以停留等待楼梯变换方向. #include <iostream> #include <queue> #include <cstdio ...

  9. Phpwind v9.0 存储型xss跨站漏洞

    漏洞版本: Phpwind v9.0 漏洞描述: Phpwind专注于中小网站应用的整合和价值的发掘,我们认为,以社区为网站的基础,可以提供丰富的应用,满足人们获取信息.交流.娱乐.消费等生活需求.获 ...

  10. 解决Windows8系统磁盘占用太多100%或99%

    关闭家庭组功能:WIN+R运行Services.msc,找到 HomeGroup Listener 和 HomeGroup Provider 服务,分别停止和禁用这2个服务.然后重新启动Windows ...