listview 实现微信删除功能向左移动item出现隐藏的删除按钮功能终于实现了,分享总结一下。(跟微信删除一样额)

来源:互联网 发布:查看linux网络地址 编辑:程序博客网 时间:2024/06/05 03:55
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. 1.自定义一个listview    
  2. import android.content.Context;    
  3. import android.util.AttributeSet;    
  4. import android.view.MotionEvent;    
  5. import android.widget.ListView;    
  6.     
  7. public class FilpperListvew extends ListView{    
  8.     private float orginX,orginY,apartX,apartY,curX,curY;    
  9.     private boolean delete = false;    
  10.     private int itemHeight =50;    
  11.     private int ratio = 1;    
  12.         
  13.     private FilpperDeleteListener filpperDeleterListener;    
  14.     public FilpperListvew(Context context) {    
  15.         super(context);    
  16.     }    
  17.     
  18.     public FilpperListvew(Context context, AttributeSet attrs){    
  19.         super(context, attrs);    
  20.     }    
  21.     //触发移动事件    
  22.     @Override    
  23.     public boolean onTouchEvent(MotionEvent ev) {    
  24.         switch (ev.getAction()){    
  25.             //记录按下的瞬间的坐标主要是初始化坐标数据,方便以后计算移动的距离    
  26.             case MotionEvent.ACTION_DOWN:    
  27.                 int temp = getChildCount();    
  28.                 itemHeight = (temp==0)?itemHeight:getChildAt(0).getHeight();    
  29.                 orginX = ev.getX(0);    
  30.                 orginY = ev.getY(0);    
  31.                 curX = orginX;    
  32.                 curY = orginY;    
  33.                 if (filpperDeleterListener != null) {    
  34.                     filpperDeleterListener.getMoveY(curX, curY);    
  35.                 }    
  36.                 break;    
  37.             //移动监听动态位置坐标的移动处理    
  38.             case MotionEvent.ACTION_MOVE:    
  39.                 float deltaX = ev.getX(ev.getPointerCount() - 1) - orginX;    
  40.                 //float deltaY = Math.abs(ev.getY(ev.getPointerCount() - 1) - orginY);    
  41.                 apartX = ev.getX()-curX;    
  42.                 apartY = ev.getY()-curY;    
  43.                 curX = ev.getX();    
  44.                 curY = ev.getY();    
  45.                 //手指触摸的上下距离不能太大(即水平移动)    
  46.                 if(apartX < 0 && -20 < apartY && apartY < 20){    
  47.                         
  48.                     if(itemHeight>apartY && filpperDeleterListener != null){    
  49.                         filpperDeleterListener.onFlipping(orginX,orginY,apartX,apartY);    
  50.                     }    
  51.                     if (Math.abs(deltaX) > this.getWidth() / ratio) {    
  52.                         delete = true;    
  53.                     } else {    
  54.                         delete = false;    
  55.                     }    
  56.                 }    
  57.                 break;    
  58.         //主要是移动距离之后判断移动的位置是回原来的位置,还是移动到值得的位置(这些的操作都是的listview中实现具体的位置移动)    
  59.             case MotionEvent.ACTION_UP:    
  60.                 if (delete && filpperDeleterListener != null) {    
  61.                     filpperDeleterListener.restoreView(curX, curY,true);    
  62.                 }    
  63.                 //判断是否符合移动的条件    
  64.                 if(!delete){    
  65.                     if(filpperDeleterListener != null){    
  66.                         filpperDeleterListener.restoreView(orginX,orginY,false);    
  67.                     }    
  68.                 }    
  69.                 reset();    
  70.                 break;    
  71.         }    
  72.         return super.onTouchEvent(ev);    
  73.     }    
  74.     
  75.     public void reset(){    
  76.         delete = false ;    
  77.         orginX = -1 ;    
  78.         orginY = -1 ;    
  79.     }    
  80.     public void setFilpperDeleteListener(FilpperDeleteListener f, int r) {    
  81.         filpperDeleterListener = f;    
  82.         ratio = r;    
  83.     }    
  84.     
  85.     public interface FilpperDeleteListener {    
  86.         //方法说明控制上下移动的位置    
  87.         public void getMoveY(float moveX, float moveY);    
  88.         //移动位置的具体的接口    
  89.         public void onFlipping(float xPosition,float yPosition,float apartX,float apartY);    
  90.         //最后的接口用来item最后的位置是否改变    
  91.         public void restoreView(float x,float y, boolean tag);    
  92.     }    
  93.         
  94.     public int getItemHeight() {    
  95.         return itemHeight;    
  96.     }    
  97.         
  98. }    
  99.  2.在activity的主布局中声明listview    
  100.     <RelativeLayout     
  101.             android:id="@+id/activity_list_rl"    
  102.             android:layout_width="fill_parent"    
  103.             android:layout_height="fill_parent">             
  104.             <cn.zan.control.view.FilpperListvew    
  105.                 android:id="@+id/filpperlistview"    
  106.                 android:layout_width="fill_parent"    
  107.                 android:layout_height="fill_parent"    
  108.                 android:cacheColorHint="#00000000"    
  109.                  android:fadingEdge="none"    
  110.                  android:listSelector="#00000000"    
  111.                 android:dividerHeight="2dp"    
  112.                 android:divider="#00000000"    
  113.                 android:scrollbars="none"/>    
  114.         </RelativeLayout>    
  115.  3.在activity中声明listview     
  116.  flipperListView = (FilpperListvew)findViewById(R.id.filpperlistview);    
  117.      
  118.  4.适配器的调用    
  119. myAdapter = new myAdapter(myActivity.this, myList);    
  120. if (flipperListView != null) {    
  121.     flipperListView.setAdapter(myAdapter);    
  122.     myAdapter.notifyDataSetChanged();    
  123.     flipperListView.setFilpperDeleteListener(new FilpperDeleteListener() {    
  124.         int moveX = 0;    
  125.         int moveY;    
  126.         @Override    
  127.         public void getMoveY(float moveXx, float moveYy) {    
  128.             moveY = (int)moveYy;    
  129.             moveX = (int)moveXx;    
  130.         }    
  131.             
  132.         @Override    
  133.         public void onFlipping(float xPosition, float yPosition,float apartX, float apartY) {    
  134.             int index = flipperListView.pointToPosition((int)xPosition, moveY);    
  135.             if(index >= 0){    
  136.                 int firstVisible = flipperListView.getFirstVisiblePosition();    
  137.                 View v = flipperListView.getChildAt(index-firstVisible);    
  138.                 RelativeLayout my_adapter_linear1 = (RelativeLayout) v.findViewById(R.id.my_adapter_linear1);    
  139.                 //临时移动几像素apartX(起始位置到终点位置)    
  140.                 int temp = (int)apartX;    
  141.                         
  142.                 if(my_adapter_linear1 != null){    
  143.                     moveX = moveX + temp;//计算移动的距离    
  144.                     //手机屏幕的像素转换dip2px,超过65像素禁止向左移动    
  145.                     //myList.get(index).get("isDelSign");判断该item没有移动的时候才进行移动    
  146.                     if(Math.abs(moveX) < ActivityUtil.dip2px(context, 65) && myList.get(index).get("isDelSign").equals("false")){    
  147.                         shopcar_adapter_linear1.scrollBy(-temp, 0);    
  148.                     }    
  149.                 }    
  150.             }    
  151.         }    
  152.             
  153.         @Override    
  154.         public void restoreView(float x, float y, boolean tag) {    
  155.             // 获取需要移动的listview项    
  156.             int index = flipperListView.pointToPosition((int)x, moveY);     
  157.             if(index >= 0){    
  158.                 int firstVisible = flipperListView.getFirstVisiblePosition();    
  159.                 View v = flipperListView.getChildAt(index-firstVisible);     
  160.                 for (int i = 0; i < myList.size(); i++) {    
  161.                     myList.get(i).put("isDelSign""false");    
  162.                 }    
  163.                 RelativeLayout my_adapter_linear1 = (RelativeLayout) v.findViewById(R.id.my_adapter_linear1);    
  164.                 if(tag){    
  165.                     myList.get(index).put("isDelSign""true");    
  166.                     Integer listview_num = flipperListView.getChildCount();    
  167.                     for(int i = 0; i < listview_num; i ++){    
  168.                         View view2 = flipperListView.getChildAt(i);    
  169.                         RelativeLayout my_adapter_linear2 = (RelativeLayout) view2.findViewById(R.id.my_adapter_linear1);    
  170.                         if (my_adapter_linear2 != null) {    
  171.                             my_adapter_linear1.scrollTo(00);    
  172.                         }    
  173.                     }    
  174.                     my_adapter_linear1.scrollTo(ActivityUtil.dip2px(context, 65), 0);//露出删除按钮(注意这里进行像素的转换从dp-px)    
  175.                 } else {    
  176.                     myList.get(index).put("isDelSign""false");    
  177.                     if (my_adapter_linear1 != null) {    
  178.                         my_adapter_linear1.scrollTo(00);//回原点    
  179.                     }    
  180.                 }    
  181.             }    
  182.             moveY =0;    
  183.         }    
  184.     }, 5);    
  185. }    
  186. //5.在适配器中view 中实时更新listview的item的坐标    
  187. @Override    
  188. //public View getView(final int position, View view, ViewGroup parent) {    
  189. if (map.get("isDelSign").equals("false")) {    
  190.     viewHolder.shopcar_adapter_linear1.scrollTo(00);;    
  191.     } else {     
  192.         viewHolder.shopcar_adapter_linear1.scrollTo(ActivityUtil.dip2px(context, 65), 0);    
  193.     }    
  194. }    
  195. 6.主要是item的的右侧隐藏了一个删除按钮看看布局(最重要设置负值滑动之后item的坐标就变成正的进而布局也跟随着显示出来了)    
  196.                 
  197. <RelativeLayout    
  198.     android:id="@+id/adapter_shopcar_del_rl"    
  199.     android:layout_width="65dp"    
  200.     android:layout_height="92dp"    
  201.     android:layout_alignParentRight="true"    
  202.     android:layout_toRightOf="@id/shopcar_adapter_linear2"    
  203.     <span style="color:#ff0000;">android:layout_marginRight="-65dp">  </span>  
  204.     <ImageButton    
  205.         android:id="@+id/adapter_shopcar_del_icon"    
  206.         android:layout_width="61.5dp"    
  207.         android:layout_height="70dp"    
  208.         android:layout_centerVertical="true"    
  209.         android:background="@drawable/shopcar_item_del_bg"    
  210.         android:contentDescription="@null"/>    
  211.     </RelativeLayout>    
  212. 这是所有的代码片段,由于设计到版权的问题代码不是很全面不懂的我们可以共同探讨    

效果图如下:

0 0
原创粉丝点击