DragDrop 和使用 RecyclerView 滑动
你可以使用 RecyclerView 实现滑动到关闭和拖放功能,而无需使用第三方库。
只需使用 RecyclerView 支持库中包含的 ItemTouchHelper
类。
使用 SimpleCallback
回调实例化 ItemTouchHelper
,根据你支持的功能,你应该覆盖 onMove(RecyclerView, ViewHolder, ViewHolder)
和/或 onSwiped(ViewHolder, int)
并最终附加到你的 RecyclerView
。
ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
// remove item from adapter
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
final int fromPos = viewHolder.getAdapterPosition();
final int toPos = target.getAdapterPosition();
// move item in `fromPos` to `toPos` in adapter.
return true;// true if moved, false otherwise
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
值得一提的是,SimpleCallback
构造函数将相同的滑动策略应用于 RecyclerView
中的所有项目。在任何情况下都可以通过简单地覆盖方法 getSwipeDirs(RecyclerView, ViewHolder)
来更新特定项目的默认滑动方向。
让我们假设我们的 RecyclerView
包含了一个 HeaderViewHolder
,我们显然不想对它进行滑动。覆盖 getSwipeDirs
就足够了,如下所示:
@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof HeaderViewHolder) {
// no swipe for header
return 0;
}
// default swipe for all other items
return super.getSwipeDirs(recyclerView, viewHolder);
}