在项目中我先试用PullToRefreshListView实现了listview的上拉加载,下拉刷新.后来发现还有个侧滑删除的功能,虽然网上还有其他的第三方框架可以同时实现这些功能,但由于整体框架已经完成了,再去更换框架,就比较麻烦了,于是我找到了一个方法,只需要对listview的item做些修改,就可以实现侧滑的功能,这样,以前的代码就无需做出太大的改变.而且还没有事件冲突哦!
所以这里用到了一个第三方框架SwipeDelMenuLayout,这是一个非常强大的框架,他可以实现任何viewgroup的侧滑功能,无耦合,无事件冲突.
在你原来代码不变的情况下,你需要做以下几步:
Step 1. 在项目根build.gradle文件中增加JitPack仓库依赖。
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
Step 2. 添加依赖
compile 'com.github.mcxtzhang:SwipeDelMenuLayout:V1.2.3'
完成上面几步后,你要开始修改你的item了,你只需要把你原来的item里面的内容提取出来,放到一个viewGroup里面,比如我这里放到了LinearLayout里面(下面布局文件里面有注释,不明白可以看看),然后在外层包裹刚才添加进来的第三方框架SwipeMenuLayout,那么它的第一个子元素是LinearLayout(我刚提取出来的item内容放入LnearLayout),他就是表面内容,它的第二个以及后面的子元素,是侧滑后显示出来的内容,我这里只有一个按钮,如果你需要的话,可以添加多个,
这里我贴上全部的代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_item_shop_activity"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="86dp"
android:background="#ffff"
android:gravity="center_vertical">
<com.mcxtzhang.swipemenulib.SwipeMenuLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_activity_item"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center_vertical"
android:clickable="true"
android:paddingBottom="1dp">
<!--表面内容 (这里面的内容就是我以前item里面的内容,现在把它提取到一个LinearLayout里面)-->
<LinearLayout
android:id="@+id/ll_activity_item_surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv_item_shopActivity_img"
android:layout_width="58dp"
android:layout_height="58dp"
android:layout_marginLeft="13dp"
/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="11dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_item_shopActivity_title"
style="@style/tv_17sp_00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题"/>
<TextView
style="@style/tv_14sp_78"
android:id="@+id/tv_item_shopActivity_introduce"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="简介"/>
</LinearLayout>
</LinearLayout>
<!--侧滑后显示的内容,如果需要多个按钮,就继续添加子元素,子元素与这个ImageView平级-->
<ImageView
android:id="@+id/img_activity_item_delete"
android:layout_width="70dp"
android:layout_height="match_parent"
android:background="#FE0D0D"
android:src="@drawable/ic_shanchu"/>
</com.mcxtzhang.swipemenulib.SwipeMenuLayout>
</LinearLayout>
这里只是对item做了修改,至于其他对listview,或者PullToRefreshListView的使用不变,不过有一点,就是使用了这个item后,你无法再添加setOnItemClickListener()事件了,所以你如果需要item的点击事件,以及对侧滑出来的按钮添加点击事件,你必须放到adapter中来写,也挺简单的.不是特别麻烦.我这里的做法是在adapter的构造函数中多传递一个Handler过来.
1,在你的activity中定义一个Handler内部类
/**
* 接受来自adapter点击的position
*/
public class MyHandler extends Handler{
public MyHandler(){
super();
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//what: 1 :删除事件 2:item点击事件
if(1==msg.what){
mDelPosition=msg.arg1;
if(activityInfoListForUp.size()>0){
delActivity(activityInfoListForUp.get(mDelPosition).getActivityId());
}
}
if(2==msg.what){
mDelPosition=msg.arg1;
Intent intent=new Intent(getActivity(), ActivityDetailActivity.class);
intent.putExtra("shopActivityInfo",activityInfoListForUp.get(mDelPosition));
startActivity(intent);
}
}
};
然后实例化他们
private MyHandler mHandler=new MyHandler();
其次在adapter里面定义构造方法,实例化的时候将activity里面的mHandler传递过来
public ActivityInfoAdapter(Context context, List<ShopActivityInfo> list,MyHandler handler){
mContext=context;
this.list=list;
this.mHandler=handler;
message=Message.obtain();
}
然后在getView方法里面写点击事件
//删除按钮 what:1
holder.img_activity_item_delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
message=mHandler.obtainMessage();
message.what=1;
message.arg1=position;
mHandler.sendMessage(message);
}
});
//item点击事件 what:2
holder.ll_activity_item_surface.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
message=mHandler.obtainMessage();
message.what=2;
message.arg1=position;
mHandler.sendMessage(message);
}
});
注意完成删除后需要调用下SwipeMenuLayout的smoothClose()方法来关闭掉侧滑状态.不然后果你自己体验下
这样基本就实现了侧滑删除功能,如果你需要侧滑出更多的按钮,直接再加就是了,
这里贴上这个框架的地址:https://github.com/mcxtzhang/SwipeDelMenuLayout
有需要的朋友可以深入研究下.
有问题可以联系我:strivezheng@foxmail.com
源码下载地址http://download.youkuaiyun.com/detail/sinstar1/9690095