ListView 實現帶有Filpper效果的左右滑動刪除 Item

jia635發表於2014-07-19

      ListView 實現帶有Filpper效果的左右滑動刪除 Item  的實現最主要的方法還是 對 Listview 的繼承重寫 。然後是在刪除過程中新增 TranslateAnimation 滑動事件。


<span style="font-size:14px;">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<15;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 ;
				//根據座標獲得滑動刪除的item的index
			    final int index =  flipperListView.pointToPosition((int)xPosition, (int)yPosition);
			    //一下兩步是獲得該條目在螢幕顯示中的相對位置,直接根據index刪除會空指標異常。因為listview中的child只有當前在螢幕中顯示的才不會為空
			    int firstVisiblePostion = flipperListView.getFirstVisiblePosition();
				View view = flipperListView.getChildAt(index - firstVisiblePostion);
				
				<span style="color:#ff0000;">TranslateAnimation tranAnimation = new TranslateAnimation(0,width,0,0);
				tranAnimation.setDuration(500);
				tranAnimation.setFillAfter(true);
				view.startAnimation(tranAnimation);</span>
				//當動畫播放完畢後,刪除。否則不會出現動畫效果(自己試驗的)。
				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();
					}
				});
				
			}
		});
	}

}
</span>

重寫的 ListView :

<span style="font-size:14px;">package com.example.filpperdeletelist;


import android.content.Context;
import android.util.AttributeSet;
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);
	}
	
}
</span>

介面卡程式碼:


<span style="font-size:14px;">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;
	}

}
</span>



下載地址:

http://download.csdn.net/detail/jia635/7651981



相關文章