listview 实现微信删除功能向左移动item出现隐藏的删除按钮功能终于实现了,分享总结一下。(跟微信删除一样额)
2013-12-09 09:57
991 查看
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> 这是所有的代码片段,由于设计到版权的问题代码不是很全面不懂的我们可以共同探讨
效果图如下:
相关文章推荐
- listview 实现微信删除功能向左移动item出现隐藏的删除按钮功能终于实现了,分享总结一下。(跟微信删除一样额)
- 自定义ListView实现仿QQ消息列表滑动item出现删除按钮
- Android ListView实现单击item出现删除按钮以及滑动出现删除按钮
- 微信小程序 实现列表项滑动显示删除按钮的功能
- 微信小程序项目总结之点赞 删除列表 分享功能
- android 中如何实现listview向左边滑动跟微信删除好友一样的效果?
- Android 使用NineOldAndroids实现仿微信listview左滑出现删除itembutton
- Android ListViewitem滑动出现删除按钮
- android APP 中微信分享功能实现 的总结
- android APP 中微信分享功能实现 的总结
- 微信小程序分享功能之按钮button 边框隐藏和点击隐藏
- android APP 中微信分享功能实现 的总结
- 微信小程序开发详解---小知识,大功能【实现按钮的随着手指移动】
- android APP 中微信分享功能实现 的总结
- 微信分享功能引入页面-控制分享时候调用的标题、图片、url和微信按钮隐藏显示控制
- Android ListView实现单击item出现删除按钮以及滑动出现删除按钮
- android 中如何实现listview向左边滑动跟微信删除好友一样的效果?
- 自定义listview,实现Item侧滑显示删除、置顶按钮
- Android实现频道列表ListView的编辑/删除/移动等功能
- Android使用Item Swipemenulistview实现仿QQ侧滑删除功能