tags: android RecyclerView
RecyclerView出来已经很久了,现在项目几乎所有的列表都换成RecyclerView。这里就不安利了,记一下使用RecyclerView实现item滑动删除之类的功能。
概要
RecyclerView的功能设计基本上都是低耦合的,扩展性很强。虽然RecyclerView本事并没有提供各种功能,但是依靠RecyclerView提供的接口,可以轻易的实现itemView移动删除的功能。
不过v7包里面还是提供了一些已经实现的功能,避免重新制造轮子。这里我们就是使用ItemTouchHelper实现这个功能。
涉及到的类:
- ItemTouchHelper
同时实现了OnItemTouchListener,ItemDecoration ,ChildAttachStateChangeListener的功能,比较复杂 - ItemTouchHelper.Callback
比较简单,主要是暴露ItemTouchHelper的功能给开发者使用。 - ItemTouchUIUtil
辅助类,方便使用ItemTouchHelper.Callback。
代码
read the fuck code
ItemTouchHelper helper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
@Override
public int getMovementFlags(RecyclerView rv, RecyclerView.ViewHolder vh) {
return makeMovementFlags(0, ItemTouchHelper.RIGHT);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
int adapterPosition = viewHolder.getAdapterPosition();
//根据adapterPosition移除item
...
}
@Override
public void clearView(RecyclerView rv, RecyclerView.ViewHolder viewHolder) {
getDefaultUIUtil().clearView(((MessageHolder) viewHolder).panel);
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if(viewHolder!=null){
getDefaultUIUtil().onSelected(((MessageHolder) viewHolder).panel);
}
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY,
int actionState, boolean isCurrentlyActive) {
getDefaultUIUtil().onDraw(c, recyclerView,
((MessageHolder) viewHolder).panel, dX, dY,actionState, isCurrentlyActive);
}
@Override
public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY,
int actionState, boolean isCurrentlyActive) {
getDefaultUIUtil().onDrawOver(c, recyclerView,
((MessageHolder) viewHolder).panel, dX, dY,actionState, isCurrentlyActive);
}
});
//绑定到recyclerView.
helper.attachToRecyclerView(recyclerView);
代码都在这里了,一共几十行代码,主要是几个方法
int getMovementFlags(RecyclerView rv, RecyclerView.ViewHolder vh)
设置移动的规则:移动的方向(上下左右),上下是拖动,左右是滑动。onSwiped(RecyclerView.ViewHolder viewHolder, int direction)
回调: 滑动结束后的回调,在这里做列表的数据操作clearView(RecyclerView rv, RecyclerView.ViewHolder viewHolder)
这是是标记要移除的Item的移动ViewonSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState)
回调: 选择的item改变了的回调,换一个item移动的时候onChildDraw(dx, dy)
这个实际是ItemDecoration的onChildDraw()回传, 作用一样,这里根据dx,dy设置出clearview产生的动画,UiUtil里就是简单的位移。onChildDrawOver(dx, dy)
同上
结束
使用ItemTouchHelper可以轻松实现左右滑动的操作,同时可以看到,上下拖拽排序也可以用这个实现。