ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
[...]
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
//Remove swiped item from list and notify the RecyclerView
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
ItemTouchHelper.SimpleCallback simpleCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(final RecyclerView.ViewHolder viewHolder, int direction) {
final int position = viewHolder.getAdapterPosition(); //get position which is swipe
if (direction == ItemTouchHelper.LEFT) { //if swipe left
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); //alert for confirm to delete
builder.setMessage("Are you sure to delete?"); //set message
builder.setPositiveButton("REMOVE", new DialogInterface.OnClickListener() { //when click on DELETE
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position); //item removed from recylcerview
sqldatabase.execSQL("delete from " + TABLE_NAME + " where _id='" + (position + 1) + "'"); //query for delete
list.remove(position); //then remove item
return;
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() { //not removing items if cancel is done
@Override
public void onClick(DialogInterface dialog, int which) {
adapter.notifyItemRemoved(position + 1); //notifies the RecyclerView Adapter that data in adapter has been removed at a particular position.
adapter.notifyItemRangeChanged(position, adapter.getItemCount()); //notifies the RecyclerView Adapter that positions of element in adapter has been changed from position(removed element index to end of list), please update it.
return;
}
}).show(); //show alert dialog
}
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(simpleCallback);
itemTouchHelper.attachToRecyclerView(recyclerView); //set swipe to recylcerview
// Get your recycler view from the XML layout
mRecyclerView = (STDRecyclerView) findViewById(R.id.recycler_view);
LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(layoutManager);
mAdapter = new SampleAdapter(versions);
// allow swiping in both directions (left-to-right and right-to-left)
mRecyclerView.setupSwipeToDelete(mAdapter, ItemTouchHelper.LEFT|ItemTouchHelper.RIGHT);
5 回答
从v22.2.0开始,Android支持团队已经包含了一个
ItemTouchHelper
类,它使刷卡到解除和拖放变得非常简单 . 这可能不像某些库那样功能齐全,但它直接来自Android团队 .**请注意,SimpleCallback会引导您要启用拖放的方向以及要启用滑动的路线 .
在代码中如果用户向左滑动则显示AlertDialog,如果用户选择REMOVE,则会从数据库中删除item并刷新recyclelerview,如果用户选择CANCEL,则recyclelerview就是这样 .
也许你可以尝试这个库:
https://github.com/daimajia/AndroidSwipeLayout
更新:我刚刚发现了另一个可以与RecyclerView一起使用的好库:
https://github.com/hudomju/android-swipe-to-dismiss-undo
This library可能会有所帮助 . 您可以在
OnDissmiss
中使用undo
supertoast我写了SwipeToDeleteRV库,它支持回收器视图上的刷卡到删除 - 撤消功能 . 它基于ItemTouchHelper,非常易于使用 .
希望对面临同样问题的人有所帮助 .
例如,您可以像往常一样在XML布局中定义回收器视图,以及一些可选属性:
所有stdrv属性都是可选的 . 如果您不指定它们,将使用默认值 .
然后创建一个子类STDAdapter的适配器,确保调用超类构造函数 . 像这样的东西:
}
接下来确保调用
setupSwipeToDelete
方法来设置滑动到删除功能 .swipe_directions
是允许滑动项目的方向 .例:
而已!对于更高级的设置(即,为不同的项目设置不同的删除消息,暂时和永久删除项目,...),请参阅项目自述页面 .