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);
}