SwipeMenuListView滑动删除框架

本文介绍了一种实现ListView左右滑动删除功能的方法,通过使用SwipeMenuListView框架,模仿QQ聊天界面的滑动操作来展示和触发删除等功能。

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

这是一个实现listView左右滑动实现删除的框架,仿照QQ聊天实现左滑(右滑)出现删除等按钮。

1、首先从github上下载SwipeMenuListView框架,依赖里面的library;

2、代码的实现:

public class MainActivity extends AppCompatActivity {

    private SwipeMenuListView spmListView;
    private List<String> list;
    private ArrayAdapter<String> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        list = new ArrayList<>();
        for(int i = 0;i<20;i++){
            list.add("这 是 第"+ i +"条 数 据");
        }

        spmListView = (SwipeMenuListView) findViewById(R.id.listView);

        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);


        spmListView.setAdapter(adapter);

        creatAddItem();
        ClickItem();
    }

    /**
     * 增加opendelect按钮
     */
    private void creatAddItem(){
        SwipeMenuCreator creator = new SwipeMenuCreator() {
            @Override
            public void create(SwipeMenu menu) {
                SwipeMenuItem openItem = new SwipeMenuItem(getApplicationContext());

                openItem.setBackground(new ColorDrawable(Color.rgb(0xc9,0xc9,0xce)));

                openItem.setWidth(dp2px(90));

                openItem.setTitle("open");

                openItem.setTitleSize(18);

                openItem.setTitleColor(Color.WHITE);

                menu.addMenuItem(openItem);

                SwipeMenuItem delectitem = new SwipeMenuItem(getApplicationContext());

                delectitem.setBackground(new ColorDrawable(Color.rgb(0xf9,0x3f,0x25)));

                delectitem.setWidth(dp2px(90));

                delectitem.setIcon(R.drawable.ic_delete);

                menu.addMenuItem(delectitem);
            }
        };
        spmListView.setMenuCreator(creator);
    }



    private void ClickItem(){
        spmListView.setOnMenuItemClickListener(new SwipeMenuListView.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
                switch (index){
                    case 0:
                        Toast.makeText(MainActivity.this,"点击打开按钮",Toast.LENGTH_LONG).show();
                        break;
                    case 1:
                        list.remove(position);
                        adapter.notifyDataSetChanged();
                        break;
                }
                return false;
            }
        });
        //左右滑动监听事件
        spmListView.setOnSwipeListener(new SwipeMenuListView.OnSwipeListener() {

            @Override
            public void onSwipeStart(int position) {
                // swipe start
                Log.d("print", "onSwipeStart: "+"--------------");
            }

            @Override
            public void onSwipeEnd(int position) {
                // swipe end
                Log.d("print", "onSwipeStart: "+"++++++++++++++++++++");
            }
        });

        //item左右滑动的打开和关闭
        spmListView.setOnMenuStateChangeListener(new SwipeMenuListView.OnMenuStateChangeListener() {
            @Override
            public void onMenuOpen(int position) {
                Log.d("print", "onSwipeStart: "+"<<<<<<<<<<<<");
            }

            @Override
            public void onMenuClose(int position) {
                Log.d("print", "onSwipeStart: "+">>>>>>>>>>>>>>>>");
            }
        });
    }

    /**
     *
     * dp转换为dip
     * @param dp
     * @return
     */
    private int dp2px(int dp) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                getResources().getDisplayMetrics());
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    /**
     * 顶部菜单栏的点击事件(改变opendelect的位置)
     * @param item
     * @return
     */
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_left) {
            spmListView.setSwipeDirection(SwipeMenuListView.DIRECTION_LEFT);
            return true;
        }
        if (id == R.id.action_right) {
            spmListView.setSwipeDirection(SwipeMenuListView.DIRECTION_RIGHT);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
3、其中dp2px是dp转换为dip的一个方法,关于Android中各单位之间的转换,可参考方法:

public static float applyDimension(int unit, float value,
                                       DisplayMetrics metrics)
    {
        switch (unit) {
        case COMPLEX_UNIT_PX:
            return value;
        case COMPLEX_UNIT_DIP:
            return value * metrics.density;
        case COMPLEX_UNIT_SP:
            return value * metrics.scaledDensity;
        case COMPLEX_UNIT_PT:
            return value * metrics.xdpi * (1.0f/72);
        case COMPLEX_UNIT_IN:
            return value * metrics.xdpi;
        case COMPLEX_UNIT_MM:
            return value * metrics.xdpi * (1.0f/25.4f);
        }
        return 0;
    }
关于其实现原理这里不多加介绍,有兴趣的可自行研究

4、Xml文件:

mainActivity的xml:

<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.example.wls.swipmenulistview.MainActivity">

    <com.baoyz.swipemenulistview.SwipeMenuListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</LinearLayout>
5、顶部菜单的实现:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/action_left"
        android:orderInCategory="100"
        android:title="Left"
        app:showAsAction="never" />

    <item
        android:id="@+id/action_right"
        android:orderInCategory="100"
        android:title="Right"
        app:showAsAction="never" />
</menu>

6、效果图:

      


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值