android 继承ListView实现滑动删除功能.

在一些用户体验较好的应用上,可以经常遇见   在ListView中  向左或向右滑动便可删除那一项列表.

具体实现  则是继承ListView实现特定功能即可.

(1). 新建 delete_button.xml文件

<?xml version="1.0" encoding="utf-8"?>

<Button xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:id="@+id/btn_delete"

android:layout_height="match_parent"

android:background="#FF0000"

android:textColor="#F8F8FF"

android:text="删除"

android:orientation="vertical" >

</Button>

很简单的布局,一个按钮,但这就是滑动时会出现的一个布局.

(2). 创建MyListView继承自 ListView.

public class MyListView extends ListView implements OnTouchListener,OnGestureListener {

private GestureDetector gestureDetector;   //监听手势的实例

public interface OnDeleteListener{       //将要删除的某项位置  回调给 MainActivity进行处理

void onDelete(int index );

}

private OnDeleteListener mListener;      //删除监听

private View deleteButton;     //删除按钮的视图

private ViewGroup itemLayout;   //需要操作项  的 ViewGroup对象

private int selectedItem;   //选中位置

private boolean isDeleteShown;   //是否有  删除按钮显示

public MyListView(Context context, AttributeSet attrs) {

super(context, attrs);

gestureDetector=new GestureDetector(getContext(),this);

setOnTouchListener(this);

}

public void setOnDeleteListener(OnDeleteListener l){

this.mListener=l;

}

@Override

public boolean onTouch(View v, MotionEvent event) {

if(isDeleteShown){

itemLayout.removeView(deleteButton);

deleteButton=null;

isDeleteShown=false;

return true;

}

else{

//如果在空白地方继续滑动  ,  禁止非法位置出现  删除按钮

if(AdapterView.INVALID_POSITION == pointToPosition((int)event.getX(), (int) event.getY()))

{

return false;

}

selectedItem=pointToPosition((int)event.getX(), (int)event.getY());

return gestureDetector.onTouchEvent(event);

}

}

@Override

public boolean onDown(MotionEvent e) {  //点击按下事件

if(!isDeleteShown){

selectedItem=pointToPosition((int)e.getX(), (int)e.getY());

}

return false;

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float x,  //手指滑动事件

float y) {

if(!isDeleteShown&&Math.abs(x)>Math.abs(y)){

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;

mListener.onDelete(selectedItem);

}

});

itemLayout=(ViewGroup) getChildAt(selectedItem - getFirstVisiblePosition());

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 false;

}

@Override

public void onLongPress(MotionEvent e) {

}

@Override

public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,

float arg3) {

return false;

}

@Override

public void onShowPress(MotionEvent arg0) {

}

@Override

public boolean onSingleTapUp(MotionEvent arg0) {

return false;

}

}

这段代码,  在构造方法中创建了 GestureDetector的实例用于监听手势,注册了touch事件,然后在onTouch进行判断,

如果删除按钮已经显示了,将将它移除掉,否则就是用GestureDetector处理当前手势.

当手指按下onGestureListener的onDown方法时,这里通过pointToPosition()方法判断当前选中的是哪一行.

当手指快速滑动时,会调用onFling()方法,在这里会去加载delete_button.xml这个布局,然后将删除按钮添加到当前选中的那一行item上。

这里删除按钮添加了一个点击事件,当点击了删除按钮时就会回调onDeleteListener的onDelete()方法,在回调方法中应该去处理具体的删除操作。

(3)新建item项

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:descendantFocusability="blocksDescendants"

android:orientation="vertical" >

<TextView

android:id="@+id/tv"

android:layout_width="wrap_content"

android:layout_height="50dp"

android:layout_centerVertical="true"

android:gravity="left|center_vertical"

android:textColor="#000" />

</RelativeLayout>

(4)  适配器

public class MyAdapter extends ArrayAdapter<String> {

public MyAdapter(Context context, int tvSourceId,List<String> objects) {

super(context, tvSourceId,objects);

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View view;

if(convertView==null){

view=LayoutInflater.from(getContext()).inflate(R.layout.item,null);

}

else{

view=convertView;

}

TextView tv=(TextView) view.findViewById(R.id.tv);

tv.setText(getItem(position));

return view;

}

}

(5) main.xml

<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"

tools:context=".MainActivity" >

<com.example.listviewdeletedemo.MyListView

android:id="@+id/mListView"

android:layout_width="match_parent"

android:layout_height="match_parent">

</com.example.listviewdeletedemo.MyListView>

</RelativeLayout>

(6)最后初始化数据,处理onDelete方法中的删除.

public class MainActivity extends Activity {

private MyListView mListView;

private MyAdapter mAdapter;

private List<String> contentList=new ArrayList<String>();  //数据集

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activity_main);

initList();

mListView=(MyListView) findViewById(R.id.mListView);

mListView.setOnDeleteListener(new OnDeleteListener() {

@Override

public void onDelete(int index) {

contentList.remove(index);

mAdapter.notifyDataSetChanged();

}

});

mAdapter=new MyAdapter(this, 0, contentList);

mListView.setAdapter(mAdapter);

}

private void initList() {

contentList.add("Content Item 1");

contentList.add("Content Item 2");

contentList.add("Content Item 3");

contentList.add("Content Item 4");

contentList.add("Content Item 5");

contentList.add("Content Item 6");

contentList.add("Content Item 7");

contentList.add("Content Item 8");

contentList.add("Content Item 9");

contentList.add("Content Item 10");

contentList.add("Content Item 11");

contentList.add("Content Item 12");

contentList.add("Content Item 13");

contentList.add("Content Item 14");

contentList.add("Content Item 15");

contentList.add("Content Item 16");

contentList.add("Content Item 17");

contentList.add("Content Item 18");

contentList.add("Content Item 19");

contentList.add("Content Item 20");

}

}

这样,一个毫无BUG的滑动删除就完成了.

来自为知笔记(Wiz)

时间: 2024-10-27 18:35:28

android 继承ListView实现滑动删除功能.的相关文章

自定义listView添加滑动删除功能

今天研究了一下android里面的手势,结合昨天学习的自定义View,做了一个自定义的listview,继承自listView,添加了条目的滑动手势操作,滑动后出现一个删除按钮,点击删除按钮,触发一个删除的事件,在事件中进行删除当选行的元素,刷新listview. 一共分为以下几步进行: 1.新建一个按钮的布局文件,用来作为动态添加的按钮:layout_button.xml <?xml version="1.0" encoding="utf-8"?> &

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

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

Android 实现用户列表信息滑动删除功能和选择删除功能

在项目开发过程中,常常需要对用户列表的信息进行删除的操作.Android中常用的删除操作方式有两种 ,一种就是类似微信的滑动出现删除按钮方式,还有一种是通过CheckBox进行选择,然后通过按钮进行删除的方式.本来的实例集成上述的两种操作方式来实现用户列表删除的效果. 设计思路:在适配器类MyAdapter一个滑动删除按钮显示或隐藏的Map,一个用于CheckBox是否选中的Map和一个与MainAcitivyt进行数据交互的接口ContentsDeleteListener,同时该接口包含两个方

本文出自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会回到起始位置,这样我们就

[转]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的效果,现在很多朋友看到这个效果应该

实现listview滑动删除功能_Android源码

实现listview滑动删除功能,动作流畅. 下载地址:http://www.devstore.cn/code/info/579.html

整合了刷新、加载更多、滑动删除功能的XListview

转载请说明出处:http://blog.csdn.net/bz419927089 如果想做带有刷新.加载更多功能的listview,我们可以使用XListview.(已经停止维护,github地址:https://github.com/Maxwin-z/XListView-Android) 如果想做带有滑动删除功能的listview,我们可以使用SwipeListview.(github地址:https://github.com/47deg/android-swipelistview) 如果想做