SlideAndDragListView侧滑删除

SlideAndDragListView

Download License Build Status API  

一个可以左右滑动item和拖放item的ListView。

Demo: 下载 或者 二维码

更新日志: CHANGELOG.md

简介

SlideAndDragListView (SDLV) 继承与ListView,SDLV可以向左或者向右滑动Item,并且可以拖放item达到排序的目的。

一些特点:

  1. 清晰的拖放操作。
  2. 在拖放的时候的直观和平滑滚动。
  3. 支持item的单击和长单击事件。
  4. 丰富的回调接口。
  5. 滑动item的方向可以是向左、向右或者两者。
  6. 等等......

SlideAndDragListView 用于各种优先级列表:收藏夹,播放列表,清单等。我希望你觉得它有用,同时,如果遇到什么问题,或者有什么建议,可以邮件我或者 issue!

引用

Gradle

compile 'com.yydcdut.sdlv:sdlv:0.5.5@aar'

或者

compile 'com.yydcdut.sdlv:sdlv:0.5.5'

aar

下载

Jar

下载

控件的使用

菜单的单击事件和item的滑动方向

步骤1

  • 在layout的xml文件中添加SlideAndDragListView
<com.yydcdut.sdlv.SlideAndDragListView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
</com.yydcdut.sdlv.SlideAndDragListView>

步骤2

  • 创建Menu并添加MenuItem
Menu menu = new Menu(true, true, 0);//第1个参数表示在拖拽的时候 item 的背景是否透明,第2个参数表示滑动item是否能滑的过头,像弹簧那样(true表示过头,就像Gif中显示的那样;false表示不过头,就像Android QQ中的那样)
menu.addItem(new MenuItem.Builder().setWidth(90)//单个菜单button的宽度
                .setBackground(new ColorDrawable(Color.RED))//设置菜单的背景
                .setText("One")//set text string
                .setTextColor(Color.GRAY)//set text color
                .setTextSize(20)//set text size
                .build());
menu.addItem(new MenuItem.Builder().setWidth(120)
                .setBackground(new ColorDrawable(Color.BLACK))
                .setDirection(MenuItem.DIRECTION_RIGHT)//设置方向 (默认方向为DIRECTION_LEFT)
                .setIcon(getResources().getDrawable(R.drawable.ic_launcher))// set icon
                .build());
//set in sdlv
listView.setMenu(menu);

类 Menu 的构造函数中的第一个参数表示在拖拽的时候 item 的背景是否透明;第二个参数表示滑动item是否能滑的过头,就像弹簧效果那样, true 表示过头,就像 Gif 中显示的那样;false表示不过头。

�如果是true:

如果是 false:

第三个参数表示 ItemViewType 类型,也就是BaseAdapter中的int getItemViewType( int )

步骤3

  • 实现 menu item 的单击事件
slideAndDragListView.setOnSlideListener(new SlideAndDragListView.OnSlideListener() {
            @Override
            public void onSlideOpen(View view, View parentView, int position, int direction) {

            }

            @Override
            public void onSlideClose(View view, View parentView, int position, int direction) {

            }
        });
slideAndDragListView.setOnMenuItemClickListener(new SlideAndDragListView.OnMenuItemClickListener() {
            @Override
            public int onMenuItemClick(View v, int itemPosition, int buttonPosition, int direction) {
                switch (direction) {
                    case MenuItem.DIRECTION_LEFT:
                        switch (buttonPosition) {
                            case 0://One
                                return Menu.ITEM_SCROLL_BACK;
                        }
                        break;
                    case MenuItem.DIRECTION_RIGHT:
                        switch (buttonPosition) {
                            case 0://icon
                                return Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP;
                        }
                        break;
                    default :
                        return Menu.ITEM_NOTHING;
                }
            }
        });

注意:如果想要滑动的话必须得设置OnSlideListener监听器。

Menu.ITEM_NOTHING`:

Menu.ITEM_SCROLL_BACK:

Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP:

创建不同类型的Menu

  • 设置 adapter 中的 ViewType
private BaseAdapter mAdapter = new BaseAdapter() {
        // .......
        @Override
        public int getItemViewType(int position) {
            return position % 2;//current menu type
        }

        @Override
        public int getViewTypeCount() {
            return 2;//menu type count
        }
        // ......
}
  • 通过 adapter 中设置的来创建不同的 Menu
List<Menu> menuList = new ArrayList<>(2);
Menu menu0 = new Menu(new ColorDrawable(Color.WHITE), true, 0);
menu0.addItem(new MenuItem.Builder().setWidth(90)//set Width
                .setBackground(new ColorDrawable(Color.RED))// set background
                .setText("One")//set text string
                .setTextColor(Color.GRAY)//set text color
                .setTextSize(20)//set text size
                .build());
menu0.addItem(new MenuItem.Builder().setWidth(120)
                .setBackground(new ColorDrawable(Color.BLACK))
                .setDirection(MenuItem.DIRECTION_RIGHT)//set direction (default DIRECTION_LEFT)
                .setIcon(getResources().getDrawable(R.drawable.ic_launcher))// set icon
                .build());
Menu menu1 = new Menu(new ColorDrawable(Color.YELLOW), false, 1);
menu1.addItem(new MenuItem.Builder().setWidth(60)
                .setBackground(new ColorDrawable(Color.RED))
                .setText("Two")
                .setTextColor(Color.GRAY)
                .setTextSize(25)
                .build());
menu1.addItem(new MenuItem.Builder().setWidth(70)
                .setBackground(new ColorDrawable(Color.BLUE))
                .setText("Three")
                .setDirection(MenuItem.DIRECTION_RIGHT)
                .setTextColor(Color.BLACK)
                .setTextSize(20)
                .build());
menuList.add(menu0);
menuList.add(menu1);
listView.setMenu(menuList)
  • Demo 效果

拖放

slideAndDragListView.setOnDragListener(new SlideAndDragListView.OnDragListener() {
            @Override
            public void onDragViewStart(int position) {

            }

            @Override
            public void onDragViewMoving(int position) {

            }

            @Override
            public void onDragViewDown(int position) {

            }
        }, mDataList);

public void onDragViewStart(int position).参数 position 表示的是刚开始拖动的时候取的item在ListView中的位置。

public void onDragViewMoving(int position) .参数 position 表示的是当前拖动的item在ListView的位置,当处于拖动的时候这个函数是会一直回调的。

public void onDragViewDown(int position) . 参数 position i傲世的是拖动的item最放到了ListView的哪个位置。

其他监听器

Item 单击

slideAndDragListView.setOnListItemClickListener(new SlideAndDragListView.OnListItemClickListener() {
            @Override
            public void onListItemClick(View v, int position) {

            }
        });

Item 长单击

slideAndDragListView.setOnListItemLongClickListener(new SlideAndDragListView.OnListItemLongClickListener() {
            @Override
            public void onListItemLongClick(View view, int position) {

            }
        });

Item 滑动监听器

SlideAndDragListView.OnSlideListener() {
            @Override
            public void onSlideOpen(View view, View parentView, int position, int direction) {

            }

            @Override
            public void onSlideClose(View view, View parentView, int position, int direction) {

            }
        });

Item 删除监听器

slideAndDragListView.setOnItemDeleteListener(new SlideAndDragListView.OnItemDeleteListener() {
            @Override
            public void onItemDelete(View view, int position) {

            }
        });

public void onItemDelete(View view, int position) 的调用是在 int onMenuItemClick(View v, int itemPosition, int buttonPosition, int direction) 返回Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP之后。

Scroll 监听器

slideAndDragListView.setOnListScrollListener(new SlideAndDragListView.OnListScrollListener(){
        @Override
        public void onScrollStateChanged(AbsListView view,int scrollState){
            if(scrollState==SlideAndDragListView.OnListScrollListener.SCROLL_STATE_FLING){

            }else if(scrollState==SlideAndDragListView.OnListScrollListener.SCROLL_STATE_FLING){

            }else if(scrollState==SlideAndDragListView.OnListScrollListener.SCROLL_STATE_TOUCH_SCROLL){

            }
        }

        @Override
        public void onScroll(AbsListView view,int firstVisibleItem,int visibleItemCount,int totalItemCount){
        }
    });

与 ListView.OnScrollListener 相同。

API

关闭 Menu

slideAndDragListView.closeSlidedItem();

调用 API 手动关闭 Menu。

删除 Menu

slideAndDragListView.deleteSlideItem();

调用 API 手动删除 Menu。

License

Copyright 2015 yydcdut

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值