王学岗ListView滑动删除

来源:互联网 发布:mac桌面 编辑:程序博客网 时间:2024/05/22 04:58

FilpperActivity

package com.example.filpperdeletelist;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.View;import android.view.animation.Animation;import android.view.animation.Animation.AnimationListener;import android.view.animation.TranslateAnimation;import com.example.filpperdeletelist.FilpperListvew.FilpperDeleteListener;public class FilpperActivity extends Activity {    private FilpperListvew flipperListView;    private MyAdapter adapter ;    private List<String> items;    private int width;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_filpper);        DisplayMetrics dm = new DisplayMetrics();        getWindowManager().getDefaultDisplay().getMetrics(dm);        width = dm.widthPixels;        flipperListView = (FilpperListvew) findViewById(R.id.filpperlistview);        items = new ArrayList<String>();        for(int i=0;i<150;i++){            items.add("item---->"+i);        }        adapter = new MyAdapter(this, items);        flipperListView.setAdapter(adapter);        //自定义的接口        flipperListView.setFilpperDeleteListener(new FilpperDeleteListener() {            @Override            public void filpperDelete(float xPosition,float yPosition) {                //listview中要有item,否则返回                if(flipperListView.getChildCount() == 0)                    return ;                Log.i("zhang_xin", "xPosition:"+xPosition+",yPosition:"+yPosition);                //根据坐标获得滑动删除的item的index                final int index =  flipperListView.pointToPosition((int)xPosition, (int)yPosition);                //一下两步是获得该条目在屏幕显示中的相对位置,直接根据index删除会空指針异常。因为listview中的child只有当前在屏幕中显示的才不会为空                int firstVisiblePostion = flipperListView.getFirstVisiblePosition();                View view = flipperListView.getChildAt(index - firstVisiblePostion);                TranslateAnimation tranAnimation = new TranslateAnimation(0,width,0,0);                tranAnimation.setDuration(500);                tranAnimation.setFillAfter(true);                view.startAnimation(tranAnimation);                //当动画播放完毕后,删除。否则不会出现动画效果(自己试验的)。                tranAnimation.setAnimationListener(new AnimationListener() {                    @Override                    public void onAnimationStart(Animation animation) {                        // TODO Auto-generated method stub                    }                    @Override                    public void onAnimationRepeat(Animation animation) {                        // TODO Auto-generated method stub                    }                    @Override                    public void onAnimationEnd(Animation animation) {                        //删除一个item                        items.remove(index);                        adapter.notifyDataSetChanged();                    }                });            }        });    }}

FilpperListVew

package com.example.filpperdeletelist;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.widget.ListView;public class FilpperListvew extends ListView {    private float myLastX = -1;    private float myLastY = -1;    private boolean delete = false;    //自定义的滑动删除监听    private FilpperDeleteListener filpperDeleterListener;    public FilpperListvew(Context context) {        super(context);        // TODO Auto-generated constructor stub    }    public FilpperListvew(Context context, AttributeSet attrs) {        super(context, attrs);        // TODO Auto-generated constructor stub    }    @Override    public boolean onTouchEvent(MotionEvent ev) {        // TODO Auto-generated method stub        switch (ev.getAction()) {        case MotionEvent.ACTION_DOWN:            // 获得第一个点的x坐标            myLastX = ev.getX(0);            myLastY = ev.getY(0);            break;        case MotionEvent.ACTION_MOVE:            // 得到最后一个点的坐标            float deltaX = ev.getX(ev.getPointerCount() - 1) - myLastX;            float deltaY = Math.abs(ev.getY(ev.getPointerCount() - 1) - myLastY);            // 可以滑动删除的条件:横向滑动大于100,竖直差小于50            if (deltaX > 100.0 && deltaY < 50) {                delete = true;            }            break;        case MotionEvent.ACTION_UP:            if (delete && filpperDeleterListener != null) {                filpperDeleterListener.filpperDelete(myLastX,myLastY);            }            reset();            break;        }        return super.onTouchEvent(ev);    }    public void reset(){        delete = false ;        myLastX = -1 ;        myLastY = -1 ;    }    public void setFilpperDeleteListener(FilpperDeleteListener f) {//设置滑动监听的关键代码        filpperDeleterListener = f;    }    //自定义的接口    public interface FilpperDeleteListener {        public void filpperDelete(float xPosition,float yPosition);    }}

MyAdapter

package com.example.filpperdeletelist;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class MyAdapter extends BaseAdapter {    private List<String> list ;    private Context context ;    public MyAdapter(Context context,List<String> list){        this.context = context ;        this.list = list;    }    @Override    public int getCount() {        // TODO Auto-generated method stub        return list.size();    }    @Override    public Object getItem(int position) {        // TODO Auto-generated method stub        return list.get(position);    }    @Override    public long getItemId(int position) {        // TODO Auto-generated method stub        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        // TODO Auto-generated method stub        convertView = LayoutInflater.from(context).inflate(R.layout.lv_item, null);        TextView text = (TextView)convertView.findViewById(R.id.tv);        text.setText(list.get(position));        return convertView;    }}

activity_filpper

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#ADD8E6"    tools:context=".FilpperActivity" >    <com.example.filpperdeletelist.FilpperListvew        android:id="@+id/filpperlistview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:cacheColorHint="#00000000"        android:listSelector="#ADD8E6"/></RelativeLayout>

lv_item

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:background="#FFFFFF"    android:padding="20dp"    android:orientation="vertical" >    <TextView         android:id="@+id/tv"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:text="item...."        android:textSize="20sp"/></LinearLayout>
0 0
原创粉丝点击