- 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"
- <span style="color:#ff0000;">android:layout_marginRight="-65dp"> </span>
- <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>
- 这是所有的代码片段,由于设计到版权的问题代码不是很全面不懂的我们可以共同探讨
效果图如下: