这是一个开源项目,实现android的listview的item左右滑动的功能,github地址https://github.com/47deg/android-swipelistview
官方推荐用Maven来集成,对于我这种小白来说,太麻烦了,所以直接将源码复制到项目里面比较方便点,
集成的方法参照http://blog.youkuaiyun.com/fireworkburn/article/details/14168549
关键步骤贴出来:
1. 将android-swipelistview-master文件夹下的swipelistview-samples工程导入eclipse中,并且新建一个包com.fortysevendeg.android.swipelistview.listview,具体可参考上面网址中的步骤;
2.将swipelistview文件夹中的src目录下的4个java文件(swipelistview\src\com\fortysevendeg\swipelistview)拷贝到swipelistview-samples工程中;
3.将swipelistview文件夹中res\values目录下的swipelistview__attrs.xml文件拷贝到工程的values目录下;
4.导入nineoldandroids-2.4.0.jar和android-support-v4.jar包;
5.clean工程,导入相关类、修复包名,没有错误,运行程序,又有新的错误,原因是引用SwipeListView的路径不对;
集成好了以后就可以开始使用了,swipelistview继承自listview,所以使用起来跟listview没有什么大区别,在使用了swipelistview的xml文件中,加入xmlns:swipe="http://schemas.android.com/apk/res-auto",然后定义listview显示在前面的layout的id和显示在后面的layout的id,如
swipe:swipeBackView="@+id/back"
swipe:swipeFrontView="@+id/front"
然后记得要在listview item的布局中定义这两个id,否则滑动的时候会奔溃,还有一系列其他参数可以配置,参见swipelistview__attrs.xml文件。
然后在代码中,如果要可以为swipelistview设置一些回调方法,使用BaseSwipeListViewListener,如:
mList.setSwipeListViewListener(new BaseSwipeListViewListener() {
@Override
public void onClickFrontView(int position) {
super.onClickFrontView(position);
}
});
设置了显示在前面的view的点击事件(如果直接使用setOnItemClickListener好像会与LongClick冲突,短按变长按),如果还需要长按的事件,先在xml中加入swipe:swipeOpenOnLongPress="false",然后直接setOnItemLongClickListener就可以了,还有很多回调方法,参照BaseSwipeListViewListener里的方法就懂了。、
源码关键的代码在SwipeListViewTouchListener的onTouch方法里,其中case MotionEvent.ACTION_MOVE:里面最后一行move(deltaX);在if (opened.get(downPosition))这个判断之前修改deltaX的值可以实现阻尼的效果如
if (swiping && downPosition != ListView.INVALID_POSITION) {
deltaX = deltaX / 2.5f;//这里设置阻尼
if (opened.get(downPosition)) {
deltaX += openedRight.get(downPosition) ? viewWidth - rightOffset : -viewWidth + leftOffset;
}
move(deltaX);
return true;
}
注意不要修改了deltaX原本的值,但是ACTION_UP后的动画效果是跟前面手指滑动的速率有关的,如果不修改,松开后动画稍有不对劲,不仔细看看不出,偷个懒,暂时不改了。