1.概述
SlideAndDragListView支持ListView的Item的拖动排序、左右滑动事件,可自定义左右滑动显示文字、图标、位移,同时支持onItemClick、onItemLongClick等监听器;
项目地址:https://github.com/yydcdut/SlideAndDragListView
grandle:
compile 'com.yydcdut.sdlv:sdlv:0.5.1@aar'
Step1:
将 SlideAndDragListView添加到布局中
<com.yydcdut.sdlv.SlideAndDragListView
android:layout_width="match_parent"
android:layout_height="match_parent">
</com.yydcdut.sdlv.SlideAndDragListView>
Step2:
创建布局并且添加布局
Menu menu = new Menu(true, true, 0);//第二个参数可以忽略
menu.addItem(new MenuItem.Builder().setWidth(90)//设置高度
.setBackground(new ColorDrawable(Color.RED))// 设置背景
.setText("One")//设置内容
.setTextColor(Color.GRAY)//设置字体颜色
.setTextSize(20)//设置字体大小
.build());
menu.addItem(new MenuItem.Builder().setWidth(120)
.setBackground(new ColorDrawable(Color.BLACK))
.setDirection(MenuItem.DIRECTION_RIGHT)//设置方向(默认是往左)
.setIcon(getResources().getDrawable(R.drawable.ic_launcher))// 设置图标
.build());
//set in sdlv
slideAndDragListView.setMenu(menu);
菜单的构造函数:Menu(bool wannaTransparentWhileDragging, boolean wannaOver, int menuViewType);
第一个参数是设置背景是否拖动时透明,第二个参数可以忽略,第三个参数int是视图的类型,来源getItemViewType(int);
如果设置为true,效果图如下:
如果设置为false,效果图如下:
step3:实现菜单项的点击事件(必须设置OnSlideListener)
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;
}
}
});
Menu.ITEM_NOTHING
效果如下:
Menu.ITEM_SCROLL_BACK
效果如下:
Menu.ITEM_DELETE_FROM_BOTTOM_TO_TOP
效果如下:
创建不同的Menu
1.在adapter中使用ViewType
private
BaseAdapter
mAdapter
=
new
BaseAdapter
() {
// .......
@Override
public
int
getItemViewType
(
int
position
) {
return
position
%
2
;
//当情menu的类型
}
@Override
public
int
getViewTypeCount
() {
return
2
;
//所有的menu数量
}
}
2.根据视图类型创建不同的菜单
List<Menu>
menuList
=
new
ArrayList<>
(
2
);//创建一个menu的list
Menu
menu0
=
new
Menu
(
new
ColorDrawable
(
Color
.WHITE
),
true
,
0
);//设置第一个menu
menu0
.
addItem(
new
MenuItem
.
Builder
()
.
setWidth(
90
)
//设置高度
.setBackground(
new
ColorDrawable
(
Color
.RED
))
// 设置背景
.setText(
"One"
)
//设置内容
.setTextColor(
Color
.GRAY
)
//设置字体颜色
.setTextSize(
20
)
//设置字体大小
.build());
menu0
.
addItem(
new
MenuItem
.
Builder
()
.
setWidth(
120
)
.setBackground(
new
ColorDrawable
(
Color
.BLACK
))
.setDirection(
MenuItem
.DIRECTION_RIGHT
)
//设置可滑动方向,默认是向左
.setIcon(getResources()
.
getDrawable(
R
.
drawable
.
ic_launcher))
// 设置图标
.build());
Menu
menu1
=
new
Menu
(
new
ColorDrawable
(
Color
.YELLOW
),
false
,
1
);//设置第二个menu
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)
Drag
1.设置拖动监听
slideAndDragListView
.
setOnDragListener(
new
SlideAndDragListView
.
OnDragListener
() {
@Override
public
void
onDragViewStart
(
int
position
) {
//position是item开始的位置
}
@Override
public
void
onDragViewMoving
(
int
position
) {
//position是它在listview中它移动的位置,当拖动item移动时这个方法将会被调用,同时,它的位置也在改变
}
@Override
public
void
onDragViewDown
(
int
position
) {
//position是拖动结束后item在listview中的位置
}
}, mDataList);
其他的监听事件
1.listview的itemClickListener;
2.listview的itemLongClickListener;
3.slideAndDragListView的slideListener:
slideAndDragListView.OnSlideListener
() {
@
Override
public
void
onSlideOpen(
View
view,
View
parentView,
int
position,
int
direction) {
//这里的view是listview的item,parentView是SDLV,position是listview中view的位置,direction是item滑动的方向
}
@
Override
public
void
onSlideClose(
View
view,
View
parentView,
int
position,
int
direction) {
}
});
4.
slideAndDragListView的滚动监听(和listview的滚动监听相似)
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
){
}
});
关闭Menu
slideAndDragListView
.
closeSlidedItem();
//手动关闭menu