由于项目需要,最近研究了下android listView的滑动删除,有两种效果,一个是类似QQ列表的滑动删除,一种是类似微信的那种滑动删除,一直知道这个是ios上的删除效果,只是后来才发现,这两种效果分别是ios之前版本的效果和新出版本的效果。关于android总是要模仿ios的UI效果的各种言论我不想去深究,我估摸着因为 Android系统没给我们准备各种各样的好的UI效果,而ios刚好不一样,所以我们只好各种仿ios了,或许也是为了证明你ios可以实现的各种Ui 效果我机器人照样可以吧,废话不多说了,今天我主要争对第一种形式的滑动删除做简要的说明。效果图如下:
下面上代码:主要是对onTouch事件的重写,发现有人把onTouch事件放到Adapter里面做处理的,发现经常获取不到 MotionEvent.ACTION_UP事件,个人认为还是直接在Activity中重写比较好,还有一种方式我觉得也应该可行,对listView 进行自定义,重写listView重写onTouch 事件,这样既不会显得Activity很累赘,也可以达到很不错的效果,我在这儿就省事儿了直接写到了Activity中。
一、xml文件activity_main:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
item.xml如下:
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
二、Activity代码:
public class MainActivity extends Activity implements OnTouchListener {
public List list = new ArrayList();
private ListView lv;
private StringAdapter adapter;
private int pointX, pointY, endX,endY;
private int position,newpos;
private Button curDel_btn;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.list);
adapter = new StringAdapter(this);
lv.setAdapter(adapter);
lv.setOnTouchListener(this);
}
@SuppressWarnings("static-access")
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println("====>>>>>>>>>>>>>>ACTION_DOWN"+MotionEvent.ACTION_DOWN);
// 手指按下,计算焦点位于ListView的那个条目
pointX = (int) event.getX();
pointY = (int) event.getY();
// 备注1
position = lv.pointToPosition(pointX, pointY);
if (curDel_btn!=null) {
curDel_btn.setVisibility(View.GONE);
}
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
System.out.println("====>>>>>>>>>>>>>>ACTION_UP"+MotionEvent.ACTION_UP);
endX = (int) event.getX();
endY=(int)event.getY();
newpos=lv.pointToPosition(endX, endY);
// 原本想着加上这个条件(newpos==position)是不是更精确些,
//经过实践发现,其实我们在滑动listView的列表的时候有时候更渴望有滑动就ok
if (Math.abs(endX - pointX) > 30) {
// 获取到ListView第一个可见条目的position
int firstVisiblePosition = lv.getFirstVisiblePosition();
// --------------备注2
View view = lv.getChildAt(position - firstVisiblePosition);
Button delbtn=(Button)view.findViewById(R.id.del);
delbtn.setVisibility(View.VISIBLE);
curDel_btn=delbtn;
delbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
list.remove(position);
adapter.notifyDataSetChanged();
}
});
}
break;
default:
break;
}
return false;
}
public class StringAdapter extends BaseAdapter {
private LayoutInflater inflater;
private String content = "";
public StringAdapter(Context context) {
inflater = LayoutInflater.from(context);
for (int i = 0; i < 10; i++) {
content = "item " + i;
list.add(content);
}
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.item, null);
}
TextView tv = (TextView) convertView.findViewById(R.id.title);
tv.setText(getItem(position) + "");
return convertView;
}
}
}
代码很简单,上面也做了注释,相信不难懂,况且我也是菜鸟,只给那些初学者提供一些方法,思路,还望各位大牛指点。
声明:eoe文章著作权属于作者,受法律保护,转载时请务必以超链接形式附带如下信息
原文作者: Android-newer
原文地址: http://my.eoe.cn/jiaxiaoya/archive/20879.html