首先继承创建继承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;
}
}

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

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

    原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...

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

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

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

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

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

    ListView 实现带有Filpper效果的左右滑动删除 Item  的实现最基本的方法还是 对 Listview 的继承重写 .然后是在删除过程中加入 TranslateAnimation 滑动事 ...

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

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  6. Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item

    1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...

  7. 仿知乎安卓client滑动删除撤销ListView

    标签(空格分隔): Android 新版的知乎安卓client有一个有趣的功能,就是在一个item里.向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了.放开手指就是删除.删除后还 ...

  8. RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能

    RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...

  9. android QQ消息左滑动删除实例(优化版SwipeListViewEX)

    仿 QQ消息左滑动删除item消息实例 源代码参考:http://blog.csdn.net/gaolei1201/article/details/42677951 自己作了一些调整,全部代码下载地址 ...

随机推荐

  1. 【spring cloud】spring cloud中启动eureka集群时候,发生端口已经绑定的报错The Tomcat connector configured to listen on port 8000 failed to start. The port may already be in use or the connector may be misconfigured.

    在分别设置 进行微服务eureka集群启动时候,执行命令行启动jar包时候,报错前面一个端口8000已经被使用,而我这里启动的配置文件中端口号是8001,怎么会导致端口冲突呢?? 但是报错我的端口冲突 ...

  2. js禁止复制粘贴

    1. oncontextmenu="window.event.returnValue=false" 将彻底屏蔽鼠标右键,其实是禁止快捷菜单,因为不光右键可以弹出这个菜单,键盘上空格 ...

  3. JCA 了解

    JCA (J2EE 连接器架构,Java Connector Architecture)是对 J2EE标准集的重要补充.因为它注重的是将 Java程序连接到非Java程序和软件包中间件的开发.连接器特 ...

  4. pthread_join和pthread_detach的用法

    //从别处拷贝过来的,只作为自己查看方便,原作者不详,请谅解. 一:关于join join join是三种同步线程的方式之一.另外两种分别是互斥锁(mutex)和条件变量(condition vari ...

  5. Tile based Rendering //后面一段是手机优化建议

    https://www.imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ 一种硬件结构 ...

  6. jquery 获取父窗口的元素、父窗口、子窗口

    一.获取父窗口元素: $("#父窗口元素ID",window.parent.document):对应javascript版本为window.parent.document.getE ...

  7. Intellij IDEA中使用log4j日志

    一.在pom.xml中添加依赖 <dependency> <groupId>log4j</groupId> <artifactId>log4j</ ...

  8. 转: 腾讯Bugly干货分享:Android应用性能评测调优

    转:http://www.kuqin.com/shuoit/20150618/346693.html?utm_source=www.race604.com 前言 在智能手机App竞争越来越激烈的今天, ...

  9. UVa145 Gondwanaland Telecom

    Time limit: 3.000 seconds 限时:3.000秒 Problem 问题 Gondwanaland Telecom makes charges for calls accordin ...

  10. Sublime Text 3 JS 格式化插件 JsFormat的配置使用

    1.首先需要下载安装包:(下载地址:https://github.com/jdc0589/JsFormat) 2.插件包放到sublime安装目录的Data\Packages目录中 3.快捷键 Ctr ...