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

1.自定义一个listview  
import android.content.Context;  
import android.util.AttributeSet;  
import android.view.MotionEvent;  
import android.widget.ListView;  
  
public class FilpperListvew extends ListView{  
    private float orginX,orginY,apartX,apartY,curX,curY;  
    private boolean delete = false;  
    private int itemHeight =50;  
    private int ratio = 1;  
      
    private FilpperDeleteListener filpperDeleterListener;  
    public FilpperListvew(Context context) {  
        super(context);  
    }  
  
    public FilpperListvew(Context context, AttributeSet attrs){  
        super(context, attrs);  
    }  
    //触发移动事件  
    @Override  
    public boolean onTouchEvent(MotionEvent ev) {  
        switch (ev.getAction()){  
            //记录按下的瞬间的坐标主要是初始化坐标数据,方便以后计算移动的距离  
            case MotionEvent.ACTION_DOWN:  
                int temp = getChildCount();  
                itemHeight = (temp==0)?itemHeight:getChildAt(0).getHeight();  
                orginX = ev.getX(0);  
                orginY = ev.getY(0);  
                curX = orginX;  
                curY = orginY;  
                if (filpperDeleterListener != null) {  
                    filpperDeleterListener.getMoveY(curX, curY);  
                }  
                break;  
            //移动监听动态位置坐标的移动处理  
            case MotionEvent.ACTION_MOVE:  
                float deltaX = ev.getX(ev.getPointerCount() - 1) - orginX;  
                //float deltaY = Math.abs(ev.getY(ev.getPointerCount() - 1) - orginY);  
                apartX = ev.getX()-curX;  
                apartY = ev.getY()-curY;  
                curX = ev.getX();  
                curY = ev.getY();  
                //手指触摸的上下距离不能太大(即水平移动)  
                if(apartX < 0 && -20 < apartY && apartY < 20){  
                      
                    if(itemHeight>apartY && filpperDeleterListener != null){  
                        filpperDeleterListener.onFlipping(orginX,orginY,apartX,apartY);  
                    }  
                    if (Math.abs(deltaX) > this.getWidth() / ratio) {  
                        delete = true;  
                    } else {  
                        delete = false;  
                    }  
                }  
                break;  
        //主要是移动距离之后判断移动的位置是回原来的位置,还是移动到值得的位置(这些的操作都是的listview中实现具体的位置移动)  
            case MotionEvent.ACTION_UP:  
                if (delete && filpperDeleterListener != null) {  
                    filpperDeleterListener.restoreView(curX, curY,true);  
                }  
                //判断是否符合移动的条件  
                if(!delete){  
                    if(filpperDeleterListener != null){  
                        filpperDeleterListener.restoreView(orginX,orginY,false);  
                    }  
                }  
                reset();  
                break;  
        }  
        return super.onTouchEvent(ev);  
    }  
  
    public void reset(){  
        delete = false ;  
        orginX = -1 ;  
        orginY = -1 ;  
    }  
    public void setFilpperDeleteListener(FilpperDeleteListener f, int r) {  
        filpperDeleterListener = f;  
        ratio = r;  
    }  
  
    public interface FilpperDeleteListener {  
        //方法说明控制上下移动的位置  
        public void getMoveY(float moveX, float moveY);  
        //移动位置的具体的接口  
        public void onFlipping(float xPosition,float yPosition,float apartX,float apartY);  
        //最后的接口用来item最后的位置是否改变  
        public void restoreView(float x,float y, boolean tag);  
    }  
      
    public int getItemHeight() {  
        return itemHeight;  
    }  
      
}  
 2.在activity的主布局中声明listview  
    <RelativeLayout   
            android:id="@+id/activity_list_rl"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent">           
            <cn.zan.control.view.FilpperListvew  
                android:id="@+id/filpperlistview"  
                android:layout_width="fill_parent"  
                android:layout_height="fill_parent"  
                android:cacheColorHint="#00000000"  
                 android:fadingEdge="none"  
                 android:listSelector="#00000000"  
                android:dividerHeight="2dp"  
                android:divider="#00000000"  
                android:scrollbars="none"/>  
        </RelativeLayout>  
 3.在activity中声明listview   
 flipperListView = (FilpperListvew)findViewById(R.id.filpperlistview);  
   
 4.适配器的调用  
myAdapter = new myAdapter(myActivity.this, myList);  
if (flipperListView != null) {  
    flipperListView.setAdapter(myAdapter);  
    myAdapter.notifyDataSetChanged();  
    flipperListView.setFilpperDeleteListener(new FilpperDeleteListener() {  
        int moveX = 0;  
        int moveY;  
        @Override  
        public void getMoveY(float moveXx, float moveYy) {  
            moveY = (int)moveYy;  
            moveX = (int)moveXx;  
        }  
          
        @Override  
        public void onFlipping(float xPosition, float yPosition,float apartX, float apartY) {  
            int index = flipperListView.pointToPosition((int)xPosition, moveY);  
            if(index >= 0){  
                int firstVisible = flipperListView.getFirstVisiblePosition();  
                View v = flipperListView.getChildAt(index-firstVisible);  
                RelativeLayout my_adapter_linear1 = (RelativeLayout) v.findViewById(R.id.my_adapter_linear1);  
                //临时移动几像素apartX(起始位置到终点位置)  
                int temp = (int)apartX;  
                      
                if(my_adapter_linear1 != null){  
					moveX = moveX + temp;//计算移动的距离  
                    //手机屏幕的像素转换dip2px,超过65像素禁止向左移动  
                    //myList.get(index).get("isDelSign");判断该item没有移动的时候才进行移动  
					if(Math.abs(moveX) < ActivityUtil.dip2px(context, 65) && myList.get(index).get("isDelSign").equals("false")){  
						shopcar_adapter_linear1.scrollBy(-temp, 0);  
					}  
                }  
            }  
        }  
          
        @Override  
        public void restoreView(float x, float y, boolean tag) {  
            // 获取需要移动的listview项  
            int index = flipperListView.pointToPosition((int)x, moveY);   
            if(index >= 0){  
                int firstVisible = flipperListView.getFirstVisiblePosition();  
                View v = flipperListView.getChildAt(index-firstVisible);   
                for (int i = 0; i < myList.size(); i++) {  
                    myList.get(i).put("isDelSign", "false");  
                }  
                RelativeLayout my_adapter_linear1 = (RelativeLayout) v.findViewById(R.id.my_adapter_linear1);  
                if(tag){  
                    myList.get(index).put("isDelSign", "true");  
                    Integer listview_num = flipperListView.getChildCount();  
                    for(int i = 0; i < listview_num; i ++){  
                        View view2 = flipperListView.getChildAt(i);  
                        RelativeLayout my_adapter_linear2 = (RelativeLayout) view2.findViewById(R.id.my_adapter_linear1);  
                        if (my_adapter_linear2 != null) {  
                            my_adapter_linear1.scrollTo(0, 0);  
                        }  
                    }  
                    my_adapter_linear1.scrollTo(ActivityUtil.dip2px(context, 65), 0);//露出删除按钮(注意这里进行像素的转换从dp-px)  
                } else {  
                    myList.get(index).put("isDelSign", "false");  
                    if (my_adapter_linear1 != null) {  
                        my_adapter_linear1.scrollTo(0, 0);//回原点  
                    }  
                }  
            }  
            moveY =0;  
        }  
    }, 5);  
}  
//5.在适配器中view 中实时更新listview的item的坐标  
@Override  
//public View getView(final int position, View view, ViewGroup parent) {  
if (map.get("isDelSign").equals("false")) {  
    viewHolder.shopcar_adapter_linear1.scrollTo(0, 0);;  
    } else {   
        viewHolder.shopcar_adapter_linear1.scrollTo(ActivityUtil.dip2px(context, 65), 0);  
    }  
}  
6.主要是item的的右侧隐藏了一个删除按钮看看布局(最重要设置负值滑动之后item的坐标就变成正的进而布局也跟随着显示出来了)  
              
<RelativeLayout  
    android:id="@+id/adapter_shopcar_del_rl"  
    android:layout_width="65dp"  
    android:layout_height="92dp"  
    android:layout_alignParentRight="true"  
    android:layout_toRightOf="@id/shopcar_adapter_linear2"  
    android:layout_marginRight="-65dp">  
    <ImageButton  
        android:id="@+id/adapter_shopcar_del_icon"  
        android:layout_width="61.5dp"  
        android:layout_height="70dp"  
        android:layout_centerVertical="true"  
        android:background="@drawable/shopcar_item_del_bg"  
        android:contentDescription="@null"/>  
    </RelativeLayout>  
这是所有的代码片段,由于设计到版权的问题代码不是很全面不懂的我们可以共同探讨  

效果图如下:


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值