您的位置:首页 > 移动开发 > 微信开发

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>
这是所有的代码片段,由于设计到版权的问题代码不是很全面不懂的我们可以共同探讨

效果图如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: