1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item:

(1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有一个简单动画。

(2)然后向右滑动时候,可以撤销删除。

2. 下面是是完整的思维过程:

Android工程结构如下:

(1)首先我们先来到主布局文件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" > <ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView> </RelativeLayout>

(2)上面使用到ListView,自然需要选用Adapter,自定义适配器ListViewAdapter,如下:

 package com.himi.listviewdeleteitem;

 import java.util.ArrayList;

 import android.content.Context;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView; public class ListViewAdpter extends BaseAdapter {
public ArrayList<String> data; // 数据源
private Context context;
private float downX; // 点下时候获取的x坐标
private float upX; // 手指离开时候的x坐标
private Button button; // 用于执行删除的button
private Animation animation; // 删除时候的动画
private View view; public ListViewAdpter(ArrayList<String> data, Context context) {
this.data = data;
this.context = context;
animation = AnimationUtils.loadAnimation(context, R.anim.push_out); // 用xml获取一个动画
} @Override
public int getCount() {
return data.size();
} @Override
public Object getItem(int arg0) {
return data.get(arg0);
} @Override
public long getItemId(int arg0) {
return arg0;
} @Override
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.list_item,
null);
holder = new ViewHolder();
holder.textView = (TextView) convertView.findViewById(R.id.text);
holder.button=(Button) convertView.findViewById(R.id.bt);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
convertView.setOnTouchListener(new OnTouchListener() { // 为每个item设置setOnTouchListener事件 @Override
public boolean onTouch(View v, MotionEvent event) {
final ViewHolder holder = (ViewHolder) v.getTag(); // 获取滑动时候相应的ViewHolder,以便获取button按钮
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 手指按下
downX = event.getX(); // 获取手指x坐标
if (button != null) {
button.setVisibility(View.GONE); // 隐藏显示出来的button
}
break;
case MotionEvent.ACTION_UP: // 手指离开
upX = event.getX(); // 获取x坐标值
break;
} if (holder.button != null) {
if (Math.abs(downX - upX) > 80 && (upX < downX)) { //向左滑动,删除item
holder.button.setVisibility(View.VISIBLE); // 显示删除button
button = holder.button; // 赋值给全局button,一会儿用
view = v; // 得到itemview,在上面加动画
return true; // 终止事件
} if(Math.abs(downX - upX) > 80 && (upX > downX)) {//撤销删除操作
if(holder.button.getVisibility() == View.VISIBLE) {//此时Button可见
holder.button.setVisibility(View.GONE);
}
return true; // 终止事件
} return false; // 释放事件,使onitemClick可以执行
}
return false;
} }); holder.button.setOnClickListener(new OnClickListener() { // 为button绑定事件 @Override
public void onClick(View v) { if (button != null) {
button.setVisibility(View.GONE); // 点击删除按钮后,影藏按钮
deleteItem(view, position); // 删除数据,加动画
} }
});
holder.textView.setText(data.get(position)); // 显示数据
return convertView;
} public void deleteItem(View view, final int position) {
view.startAnimation(animation); // 给view设置动画
animation.setAnimationListener(new AnimationListener() { @Override
public void onAnimationStart(Animation animation) {
} @Override
public void onAnimationRepeat(Animation animation) {
} @Override
public void onAnimationEnd(Animation animation) { // 动画执行完毕
data.remove(position); // 把数据源里面相应数据删除
notifyDataSetChanged(); }
}); } static class ViewHolder {
TextView textView; // 显示数据的view
Button button; // 删除按钮
} }

 上面引用到一个动画为res/anim/push_out.xml,如下:

 <?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" > <translate
android:duration="1000"
android:fromXDelta="0"
android:toXDelta="100%p" /> </set>

(3)接下来我们来到item的布局list_item.xml,如下:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants"
> <TextView
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="50dp"
android:gravity="center"
android:text="默认" /> <Button
android:id="@+id/bt"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:text="删除"
android:visibility="gone" /> </LinearLayout>

这里布局稍微注意一点:当我们向左滑动item的时候,显示删除按钮,这个时候我们希望整个item内容相应向左移动,给用户一个删除按钮出现的感觉。

所以这里我们设置TextView的width属性为match_parent,同时weight属性为1,目的是让TextView占据所有剩余空间。

这里我们还设置了Button的height属性也为50dp,和上面TextView文字一样高,用户视觉感觉好一点,width属性为实际内容大小。

当我们向左滑动的时候,删除Button出现了,它会占据TextView显示的空间(TextView是占据所有剩余空间),这样很自然地TextView的内容就会相应地向左显示。

(4)接下来比较简单了,来到MainActivity,如下:

 package com.himi.listviewdeleteitem;

 import java.util.ArrayList;

 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast; public class MainActivity extends Activity {
private ListView listView; //listview控件
private ArrayList<String> contentStrings = new ArrayList<String>(); //数据源
private ListViewAdpter adapter; //适配器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list);
initData(); //初始化数据
setListener(); //绑定事件
}
private void initData() {
contentStrings.add("Item 1");
contentStrings.add("Item 2");
contentStrings.add("Item 3");
contentStrings.add("Item 4");
contentStrings.add("Item 5");
contentStrings.add("Item 6");
contentStrings.add("Item 7");
contentStrings.add("Item 8");
contentStrings.add("Item 9");
contentStrings.add("Item 10");
contentStrings.add("Item 11");
contentStrings.add("Item 12");
contentStrings.add("Item 13");
contentStrings.add("Item 14");
contentStrings.add("Item 15"); adapter=new ListViewAdpter(contentStrings, this);
listView.setAdapter(adapter);
} private void setListener() { listView.setOnItemClickListener(new OnItemClickListener() { //点击每项item时候执行
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
Toast.makeText(MainActivity.this, "点击事件,执行你的操作", Toast.LENGTH_SHORT).show();
}
}); } }

(5)部署程序到手机上,如下:

Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item的更多相关文章

  1. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  2. Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

    1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一 ...

  3. Android 高级UI设计笔记01:使用ExpandableListView组件(ListView的扩展)

    1.ExpandableListView是一个用来显示二级节点的ListView. 比如如下效果的界面: 2.使用ExpandableListView步骤 (1)要给ExpandableListVie ...

  4. Android 高级UI设计笔记06:仿微信图片选择器(转载)

    仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache ...

  5. Android 高级UI设计笔记09:Android如何实现无限滚动列表

    ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们提供了一个良好,整洁的用户体验 ...

  6. Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

    Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它 ...

  7. Android 高级UI设计笔记09:Android实现无限滚动列表

    1. 无限滚动列表应用场景: ListView和GridView已经成为原生的Android应用实现中两个最流行的设计模式.目前,这些模式被大量的开发者使用,主要是因为他们是简单而直接的实现,同时他们 ...

  8. Android 高级UI设计笔记21:Android SegmentView(分段选择控件)

    1. 分段控制(SegmentView) 首先我们先看看什么是SegmentView的效果,如下: 分段控制这个View控件是ios7的分段控制,和QQ消息页面顶部的效果一样,android没有这个控 ...

  9. Android 高级UI设计笔记19:PopupWindow使用详解

    1. PopupWindow使用 PopupWindow这个类用来实现一个弹出框,可以使用任意布局的View作为其内容,这个弹出框是悬浮在当前activity之上的. 2. PopupWindow使用 ...

随机推荐

  1. 读《编写高质量代码-Web前端开发修炼之道》笔记

    第一章 1.Web标准由一系列标准组合而成,核心理念是将网页的结构,样式和行为分离,所以分为三大部分:结构标准,样式标准和行为标准.结构标准包括XML标准,XHTML标准,HTML标准:样式标准指CS ...

  2. SDN环境搭建(mininet,OVS,ryu安装及命令)

    1.mininet安装与使用 1.1mininet安装 ubuntu 12.04/14.04/14.10      命令行  sudo apt-get install mininet 1.2 mini ...

  3. Hadoop学习之--Capaycity Scheduler源码分析

    Capacity Scheduler调度策略当一个新的job是否允许添加到队列中进行初始化,判断当前队列和用户是否已经达到了初始化数目的上限,下面就从代码层面详细介绍整个的判断逻辑.Capaycity ...

  4. homework_06 围棋程序改进

    1) 把程序编译通过, 跑起来. 读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能比较容易地了解这些程序在干什么. 把正确的 playPrev(GoMove) 的方法给实现了. 注释见Git ...

  5. fx-experience-tools

    http://fxexperience.com/2012/03/announcing-fx-experience-tools/ I have some cool new stuff for you t ...

  6. C++ Name Mangling 为什么不编码返回值参数

    这篇文章主要是推荐下 http://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html 这篇文章从编译器的角度看问题,比较深入. 回到题目,为 ...

  7. UVALive 7456 Least Crucial Node (并查集)

    Least Crucial Node 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/C Description http://7 ...

  8. C#应用Newtonsoft.Json操作json

    Newtonsoft.Json是一个开源的C#操作json的项目,应用起来非常简单.其github地址; 下面的代码演示了如何应用Newtonsoft.Json序列号和反序列化. using Newt ...

  9. 应用反射写的tostring方法

    应用反射写的tostring方法 应用反射写的tostring方法,方便以后查询 代码 package com.chzhao.reflecttest; import java.lang.reflect ...

  10. UVa 1629 Cake slicing (记忆化搜索)

    题意:一个矩形蛋糕上有好多个樱桃,现在要做的就是切割最少的距离,切出矩形形状的小蛋糕,让每个蛋糕上都有一个樱桃,问最少切割距离是多少. 析:很容易知道是记忆化搜索,我们用dp[u][d][l][r]来 ...