自己定义滑动删除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;
}
}
自己定义滑动删除item的ListView。的更多相关文章
- 【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...
- [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...
- Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...
- ListView 实现带有Filpper效果的左右滑动删除 Item
ListView 实现带有Filpper效果的左右滑动删除 Item 的实现最基本的方法还是 对 Listview 的继承重写 .然后是在删除过程中加入 TranslateAnimation 滑动事 ...
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...
- Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item
1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...
- 仿知乎安卓client滑动删除撤销ListView
标签(空格分隔): Android 新版的知乎安卓client有一个有趣的功能,就是在一个item里.向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了.放开手指就是删除.删除后还 ...
- RecyclerView借助ItemTouchHelper实现拖动和滑动删除功能
RecyclerView是官方推荐代替ListView的空间,怎样实现RecyclerView列表元素的拖动呢? 官方提供了ItemTouchHelper类使用过程例如以下: 定义ItemTouchH ...
- android QQ消息左滑动删除实例(优化版SwipeListViewEX)
仿 QQ消息左滑动删除item消息实例 源代码参考:http://blog.csdn.net/gaolei1201/article/details/42677951 自己作了一些调整,全部代码下载地址 ...
随机推荐
- 某游戏研究之字符过滤类-WorldFilter
所谓字符过滤器,常常用在聊天的内容,比如一连串的骂人难听的话,我们要屏蔽掉,避免造成不好的东西! 当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打LOL的时候,算了不讲了,都 ...
- SQLAlchemy使用笔记--SQLAlchemy ORM(二)
參考: http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#building-a-relationship http://docs.sqla ...
- [转]Loading and Running a Local Package Programmatically
本文转自:http://msdn.microsoft.com/en-us/library/ms136090.aspx You can run Integration Services packages ...
- jquery触发/失去焦点事件
触发焦点: $("Element").focus() 触发每一个匹配元素获得焦点事件. $("Element").focus(function) 事件会在获得焦 ...
- 过滤器chain.doFilter(request,response)的含义
过滤器的生命周期一般都要经过下面三个阶段: 初始化: 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上 ...
- 纯 PHP 代码最好在文件末尾删除 PHP 结束标记
如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记.这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图. & ...
- C# 深入理解堆栈、堆在内存中的实现
尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序.同时,还需要具备一些基础的内存管理工作机制 ...
- TestNG 八 并发测试
一. Concurrenttesting: 下面的例子是输出进程ID,threadPoolSize用来指明线程池的大小,也就是并发的线程数目是多少 5次调用,有3个线程可调用 @Test(invoca ...
- Android studio及eclipse中的junit单元測试
转载请标明出处:http://blog.csdn.net/nmyangmo/article/details/51179106 前一段时间有人问我单元測试的相关内容,我稍作总结做日志例如以下: 由于我接 ...
- php遍历文件夹代码实现
<?php //遍历文件夹 function my_scandir($dir){ $files = array(); if (is_dir($dir)){ if($handle = opendi ...