PullToRefresh 加入侧滑删除功能

本文介绍如何在现有项目中集成侧滑删除功能,通过修改ListView的Item并利用SwipeDelMenuLayout框架,实现在不大幅改动原有代码的基础上添加侧滑删除功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中我先试用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值