可以拖动和侧滑Item的ListView开源组件

作者: wxyass 分类: Android 发布时间: 2017-06-06 14:19

SlideAndDragListView 开源框架
SlideAndDragListView 的Fork地址
Demo下载

SlideAndDragListView

Download License Build Status API

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

sdlv

Demo: 下载

更新日志: CHANGELOG.md

一. 简介

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

一些特点:

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

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

二. 引用

2.1 Gradle引用

compile 'com.yydcdut:sdlv:0.7.6'

2.2 Jar引用

下载方式1
下载方式2

三. 控件的使用

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

步骤1

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

步骤2

  • 创建 Menu 并添加 MenuItem
Menu menu = new Menu(true, 0);//第1个参数表示滑动 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
                .setIcon(getResources().getDrawable(R.drawable.ic_launcher))// set icon
                .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 是否能滑的过头,就像弹簧效果那样, true 表示过头,就像 Gif 中显示的那样;false 表示不过头

如果是true:

如果是 false:

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

步骤3

  • 实现 menu item 的单击事件
slideAndDragListView.setOnMenuItemClickListener(new 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;
        }
        return Menu.ITEM_NOTHING;
    }
});

Menu.ITEM_NOTHING:

Menu.ITEM_SCROLL_BACK:

Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP:

3.2 创建不同类型的 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 效果

3.3 拖放

ApplicationInfo mDraggedEntity;
List<ApplicationInfo> mDataList;

// ...init...

slideAndDragListView.setOnDragDropListener(new OnDragDropListener() {
    @Override
    public void onDragViewStart(int beginPosition) {
        mDraggedEntity = mDataList.get(beginPosition);
    }

    @Override
    public void onDragDropViewMoved(int fromPosition, int toPosition) {
        ApplicationInfo applicationInfo = mDataList.remove(fromPosition);
        mDataList.add(toPosition, applicationInfo);
    }

    @Override
    public void onDragViewDown(int finalPosition) {
        mDataList.set(finalPosition, mDraggedEntity);
    }
});

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

public void onDragDropViewMoved(int fromPosition, int toPosition) .参数 fromPositiontoPosition 表示从哪个位置拖动到哪个位置

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

3.4 其他监听器

3.4.1 Item 滑动监听器

slideAndDragListView.setOnSlideListener(new 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) {

    }
});

3.4.2 Item 删除监听器

slideAndDragListView.setOnItemDeleteListener(new OnItemDeleteListener() {
    @Override
    public void onItemDeleteAnimationFinished(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 之后

3.4.3 Item 回滚监听器

slideAndDragListView.setOnItemScrollBackListener(new OnItemScrollBackListener() {
    @Override
    public void onScrollBackAnimationFinished(View view, int position) {

    }
});

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

3.5 API

3.5.1 打开 Menu

slideAndDragListView.slideItem(position, direction)

调用 API 手动打开 Menu

3.5.2 关闭 Menu

slideAndDragListView.closeSlidedItem();

调用 API 手动关闭 Menu

3.5.3 删除 Menu

slideAndDragListView.deleteSlideItem();

调用 API 手动删除 Menu

3.5.4 拖放

slideAndDragListView.startDrag(position);

调用 API 手动实施拖拽

3.5.5 不拖动 ViewType 类型的 Header 或 Footer

slideAndDragListView.setNotDragHeaderCount(1);
slideAndDragListView.setNotDragFooterCount(1);

具体操作: HeaderFooterViewTypeActivity.java

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.

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注