Android初窥RecyclerView真容(二)


继续上一章提到的RecyclerView。这篇来写写如何实现侧滑删除,长按拖拽的功能。

首先在adapter中还需要增加,删除和交换位置的方法,来与前端实现交互

/**

* 移动Item

*

* @param fromPosition

* @param toPosition

*/

public void moveItem(int fromPosition, int toPosition) {

//做数据的交换

if (fromPosition < toPosition) {

for (int index = fromPosition; index < toPosition; index++) {

Collections.swap(数据源, index, index + 1);

}

} else {

for (int index = fromPosition; index > toPosition; index--) {

Collections.swap(数据源, index, index - 1);

}

}

notifyItemMoved(fromPosition, toPosition);

}

/**

* 滑动Item

*

* @param position

*/

public void removeItem(int position) {

数据源.remove(position);//删除数据

notifyItemRemoved(position);

}

接着就是交互最重要的控件类ItemTouchHelper的声明了

ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {

@Override

public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {//actionState : action状态类型,有三类 ACTION_STATE_DRAG (拖曳),ACTION_STATE_SWIPE(滑动),ACTION_STATE_IDLE(静止)

int dragFlags = makeFlag(ItemTouchHelper.ACTION_STATE_DRAG, ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//支持上下左右的拖曳

int swipeFlags = makeMovementFlags(ItemTouchHelper.ACTION_STATE_SWIPE, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT);//表示支持左右的滑动

return makeMovementFlags(dragFlags, swipeFlags);//直接返回0表示不支持拖曳和滑动

}

/**

* @param recyclerView attach的RecyclerView

* @param viewHolder 拖动的Item

* @param target 放置Item的目标位置

* @return

*/

@Override

public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

int fromPosition = viewHolder.getAdapterPosition();//要拖曳的位置

int toPosition = target.getAdapterPosition();//要放置的目标位置

mRecyclerAdapter.moveItem(fromPosition, toPosition);

return true;

}

/**

* @param viewHolder 滑动移除的Item

* @param direction

*/

@Override

public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

int position = viewHolder.getAdapterPosition();//获取要滑动删除的Item位置

mRecyclerAdapter.removeItem(position);

}

@Override

public boolean isLongPressDragEnabled() {

return super.isLongPressDragEnabled();//不支持长按拖曳效果直接返回false

}

@Override

public boolean isItemViewSwipeEnabled() {

return super.isItemViewSwipeEnabled();//不支持滑动效果直接返回false

}

});

将声明完毕的ItemTouchHelper附件到view上去

itemTouchHelper.attachToRecyclerView(mRecyclerView);

就基本实现了我们需要的功能