SlideAndDragListView
一个可以左右滑动item和拖放item的ListView。
更新日志: CHANGELOG.md
简介
SlideAndDragListView (SDLV) 继承与ListView,SDLV可以向左或者向右滑动Item,并且可以拖放item达到排序的目的。
一些特点:
- 清晰的拖放操作。
- 在拖放的时候的直观和平滑滚动。
- 支持item的单击和长单击事件。
- 丰富的回调接口。
- 滑动item的方向可以是向左、向右或者两者。
- 等等......
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.