欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android ListView实现仿iPhone实现左滑删除按钮的简单实例

程序员文章站 2024-03-07 21:58:39
需要自定义listview。这里就交floatdellistview吧。 复写ontouchevent方法。如下: @override public bo...

需要自定义listview。这里就交floatdellistview吧。

复写ontouchevent方法。如下:

@override
  public boolean ontouchevent(motionevent ev) { 
    switch (ev.getaction()) { 
      case motionevent.action_down:<br>          // 获取按下的条目视图(child view) 
        int childcount = getchildcount(); 
        int[] listviewcoords = new int[2]; 
        getlocationonscreen(listviewcoords); 
        int x = (int) ev.getrawx() - listviewcoords[0]; 
        int y = (int) ev.getrawy() - listviewcoords[1]; 
        for (int i = 0; i < childcount; i++) { 
          downchild = getchildat(i); // 
          rect rect = new rect(); 
          assert downchild != null; 
          downchild.gethitrect(rect); 
 
          int childposition = getpositionforview(downchild); 
 
          if (rect.contains(x, y)) { 
            downx = ev.getrawx(); 
            int downposition = childposition; 
 
            velocitytracker = velocitytracker.obtain(); 
            assert velocitytracker != null; 
            velocitytracker.addmovement(ev); 
            break; 
          } 
        } 
        isswipe = false; 
        break; 
      case motionevent.action_move: 
        velocitytracker.addmovement(ev);<br>          // 计算水平和垂直方向移动速度 
        velocitytracker.computecurrentvelocity(1000); 
        float velocityx = math.abs(velocitytracker.getxvelocity()); 
        float velocityy = math.abs(velocitytracker.getyvelocity()); 
<br>          // 水平移动距离 
        float deltax = ev.getrawx() - downx; 
        float deltamode = math.abs(deltax); 
        if (deltax > 150) {// right swipe(右滑) 
          isswipetoleft = false; 
        } else if (deltax < -150) {// left swipe(左滑) 
          isswipetoleft = true; 
        }<br>          // 如果水平滑动距离大于零,并且水平滑动速率比垂直大,说明是水平滑动 
        if (deltamode > 0 && velocityy < velocityx) {<br>            // 这里的floatdelbuttonlayout是自定义的linearlayout。 
          ((floatdelbuttonlayout) downchild).showdelbutton(ev, isswipetoleft); 
          isswipe = true; 
        } 
        break; 
      case motionevent.action_cancel: 
      case motionevent.action_up: 
        downchild.setselected(false); 
        if (isswipe) { 
          isswipe = false; 
          return true; 
        } 
        break; 
    } 
    return super.ontouchevent(ev); 
  }

floatdelbuttonlayou.java :

public class floatdelbuttonlayout extends linearlayout { 
<br>   // 提供删除按钮的接口 
  private ondellistener dellistener; 
<br>   // 当前视图在列表中的索引,在dellistener中使用 
  private int index; 
<br>   // 右滑 还是 左滑?<br>  private boolean isswipetoleft;<br> 
  public void setondellistener(ondellistener listener, int i) { 
    dellistener = listener; 
    index = i; 
  } 
 
  public floatdelbuttonlayout(context context) { 
    super(context, null); 
  } 
 
  public floatdelbuttonlayout(context context, attributeset attrs) { 
    super(context, attrs, 0); 
  } 
 
  public floatdelbuttonlayout(context context, attributeset attrs, int defstyle) { 
    super(context, attrs, defstyle); 
  } 
<br>   // 用来显示或者隐藏删除按钮。 
  public void showdelbutton(motionevent ev, boolean isswipetoleft) { 
    this.isswipetoleft = isswipetoleft; 
    ontouchevent(ev); 
  } 
 
  private onclicklistener clickdel = new onclicklistener() { 
    @override
    public void onclick(view v) { 
      dellistener.ondel(index); 
    } 
  }; 
<br>   /**<br>    * 这里的event是我们显示的从floatdellistview的ontouchevent里面传进来的,<br>   */
  @override
  public boolean ontouchevent(motionevent event) { 
    switch (motioneventcompat.getactionmasked(event)) { 
      case motionevent.action_move:<br>          // 获取删除按钮对象,视图layout中必须要有id为del_button的button标签 
        button view = (button) findviewbyid(r.id.del_button); 
        view.settext(r.string.del);<br>          // 设置button的marginlayoutparams,当然可以做成各种动作,比如渐隐之类的显示出来。 
        marginlayoutparams layoutparams = (marginlayoutparams) view.getlayoutparams(); 
        assert layoutparams != null; 
        if (isswipetoleft) { 
          view.setvisibility(view.visible); 
          view.setonclicklistener(clickdel); 
          layoutparams.leftmargin = -200; 
        } else { 
          view.setvisibility(view.gone); 
          layoutparams.leftmargin = 0; 
        } 
        view.setlayoutparams(layoutparams); 
        invalidate(); 
        break; 
    } 
    return super.ontouchevent(event); 
  } 
 
  public interface ondellistener { 
    void ondel(int i); 
  } 
}

以上这篇android listview实现仿iphone实现左滑删除按钮的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。