自己定义滑动删除item的ListView。

首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类。

会使用到AbsList中的pointToPosition(int x, int y)方法。这种方法主要是依据点击的位置获取点击行的在列表中的索引。

还有ViewGroup中的getChildAt(int index)方法,主要用于依据当前的索引获取子控件。这个(这个索引以可见屏幕顶端開始)。

之所以实现OnTouchListener,OnGestureListener。是由于OnGestureListener要获取到OnTouchListener传递的事件。

package com.example.mylistview;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.Toast;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;

public class MyListView extends ListView implements OnTouchListener,OnGestureListener
{
	private GestureDetector gestureDetector;
	private View deleteButton;
	private ViewGroup itemLayout;
	private onDeleteListener listener;
	private int selectedItem;
	private boolean isDeleteShown;
	private Context lcontext;

	public void setonDeleteListener(onDeleteListener l)
	{
		listener = l;
	}
	//回调接口
	public interface onDeleteListener
	{
		void onDelete(int index);
	}

	public MyListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		gestureDetector = new GestureDetector(getContext(), this);
		lcontext = context;
		setOnTouchListener(this);
	}

	//事件的传入口。分发事件给gestureDetector。
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		if(isDeleteShown)
		{
			itemLayout.removeView(deleteButton);
			deleteButton = null;
			isDeleteShown = false;
			return false;
		}
		return gestureDetector.onTouchEvent(event);
	}

	@Override
	public boolean onDown(MotionEvent e) {
		if(!isDeleteShown)
		{
			//所按下位置的行数
			selectedItem = pointToPosition((int)e.getX(),(int) e.getY());
		}
		return true;
	}

	//处理滑动事件
	@Override
	public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
			float velocityY) {
		//假设按钮没有显示而且在x轴上的速度大于在y轴上的速度
		if(!isDeleteShown && Math.abs(velocityX) > Math.abs(velocityY))
		{
			deleteButton = LayoutInflater.from(getContext()).inflate(R.layout.delete_button, null);
			deleteButton.setOnClickListener(new OnClickListener() {

				@Override
				public void onClick(View v) {
					itemLayout.removeView(deleteButton);
					deleteButton = null;
					isDeleteShown = false;
					listener.onDelete(selectedItem);
				}
			});
			//(从当前页面可见的開始)获取一行的布局
			itemLayout = (ViewGroup) getChildAt(selectedItem - getFirstVisiblePosition());
			if(itemLayout == null)
			{
				Toast.makeText(lcontext, "请选择可用的行。", Toast.LENGTH_SHORT).show();
				return false;
			}
			//设置button的加入參数
			RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
			params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
			params.addRule(RelativeLayout.CENTER_VERTICAL);
			itemLayout.addView(deleteButton, params);
			isDeleteShown = true;
		}
		return true;
	}

	@Override
	public void onShowPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public boolean onSingleTapUp(MotionEvent e) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
			float distanceY) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void onLongPress(MotionEvent e) {
		// TODO Auto-generated method stub

	}

}

之后定义删除按钮布局。和主界面的布局。item布局。

自己定义adapter:

package com.example.mylistview;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<String>
{

	public MyAdapter(Context context, int resource, List<String> objects) {
		super(context, resource, objects);
		// TODO Auto-generated constructor stub
	}

	@Override
	public View getView(int position,View convertView,ViewGroup parent)
	{
		View view;
		if(convertView == null)
		{
			view = LayoutInflater.from(getContext()).inflate(R.layout.list_view_item, null);
		}
		else
		{
			view = convertView;
		}
		TextView tv = (TextView)view.findViewById(R.id.text_view);
		tv.setText(getItem(position));
		return view;

	}

}

主界面代码:

</pre><pre name="code" class="java">package com.example.mylistview;

import java.util.ArrayList;
import java.util.List;

import com.example.mylistview.MyListView.onDeleteListener;

import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.app.Activity;

public class MainActivity extends Activity
{
	MyListView myList;
	MyAdapter adapter;
	private List<String> list = new ArrayList<String>();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		initList();
		myList = (MyListView)findViewById(R.id.myList);
		//传入接口,并实现对应的方法
		myList.setonDeleteListener(new onDeleteListener() {
			@Override
			//依据回调传回来的item索引删除对应的行
			public void onDelete(int index) {
				list.remove(index);
				adapter.notifyDataSetChanged();
			}
		});
		adapter = new MyAdapter(this, 0, list);
	myList.setAdapter(adapter);
	}
	private void initList() {
		list.clear();
		list.add("item 1");
		list.add("item 2");
		list.add("item 3");
		list.add("item 4");
		list.add("item 5");
		list.add("item 6");
		list.add("item 7");
		list.add("item 8");
		list.add("item 9");
		list.add("item 10");
		list.add("item 11");
		list.add("item 12");
		list.add("item 13");
		list.add("item 14");
		list.add("item 15");
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		if(item.getItemId() == R.id.reLoad)
		{
			initList();
			adapter.notifyDataSetChanged();
		}
		return true;
	}
}
时间: 2024-11-05 22:56:28

自己定义滑动删除item的ListView。的相关文章

自定义滑动删除item的ListView。

首先继承创建继承ListView和实现OnTouchListener,OnGestureListener的类. 会使用到AbsList中的pointToPosition(int x, int y)方法,这个方法主要是根据点击的位置获取点击行的在列表中的索引. 还有ViewGroup中的getChildAt(int index)方法,主要用于根据当前的索引获取子控件.这个(这个索引以可见屏幕顶端开始). 之所以实现OnTouchListener,OnGestureListener.是因为OnGes

【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListVi

[转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListView的下拉刷新等等效果,我今天实现的是ListView的item的左右滑动删除item的效果,现在很多朋友看到这个效果应该

Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListView的下拉刷新等等效果,我今天实现的是ListView的item的左右滑动删除item的效果,现在很多朋友看到这个效果应该

本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877)Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道

Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果, 之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变 成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就

ListView 实现带有Filpper效果的左右滑动删除 Item

ListView 实现带有Filpper效果的左右滑动删除 Item  的实现最主要的方法还是 对 Listview 的继承重写 .然后是在删除过程中添加 TranslateAnimation 滑动事件. <span style="font-size:14px;">public class FilpperActivity extends Activity { private FilpperListvew flipperListView; private MyAdapter

滑动删除Item,拖拽切换Item,你想了解的都在这儿

1. 概述 如果上两篇对RecyclerView介绍后,依然没有引起你的兴趣,那么下面关于RecyclerView的使用我相信一定会让你如获珍宝.直接看运行效果. 图-1 RecyclerView滑动删除 图-2 RecyclerView拖拽切换 用ListView或者GridView实现上图中的功能非常麻烦,而如果用RecyclerView来实现,则非常简单. 如果对RecyclerView还没有认识的同学,可以查看这两篇文章. RecyclerView使用一 RecyclerView使用二

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i