gpt4 book ai didi

android - RecyclerView 中的确认和撤消删除

转载 作者:IT老高 更新时间:2023-10-28 22:14:10 35 4
gpt4 key购买 nike

我在 RecyclerView 中有一个简单项目的列表。使用 ItemTouchHelper 很容易实现“滑动删除”行为。

public class TripsAdapter extends RecyclerView.Adapter<TripsAdapter.VerticalItemHolder> {
private List<Trip> mTrips;
private Context mContext;
private RecyclerView mRecyclerView;

[...]

//Let adapter know his RecyclerView. Attaching ItemTouchHelper
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new TripItemTouchHelperCallback());
itemTouchHelper.attachToRecyclerView(recyclerView);
mRecyclerView = recyclerView;
}

[...]

public class TripItemTouchHelperCallback extends ItemTouchHelper.SimpleCallback {
public TripItemTouchHelperCallback (){
super(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.RIGHT);
}

@Override
public boolean onMove(RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
//some "move" implementation
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) {
//AND WHAT HERE?
}
}
}

效果很好。但是我还需要执行一些撤消操作或确认。最好的方法是什么?

第一个问题是如何插入另一个 View 来代替删除确认对话框?如果用户选择撤消删除,如何恢复刷过的项目?

最佳答案

我同意@Gabor 的观点,即最好软删除项目并显示撤消按钮。

但是我使用 Snackbar 来显示 UNDO。对我来说实现起来更容易。

我将 Adapter 和 RecyclerView 实例传递给我的 ItemTouchHelper 回调。我的 onSwiped 很简单,大部分工作都是由适配器完成的。

这是我的代码(编辑于 2016/01/10):

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
mAdapter.onItemRemove(viewHolder, mRecyclerView);
}

适配器的onItemRemove方法是:

   public void onItemRemove(final RecyclerView.ViewHolder viewHolder, final RecyclerView recyclerView) {
final int adapterPosition = viewHolder.getAdapterPosition();
final Photo mPhoto = photos.get(adapterPosition);
Snackbar snackbar = Snackbar
.make(recyclerView, "PHOTO REMOVED", Snackbar.LENGTH_LONG)
.setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View view) {
int mAdapterPosition = viewHolder.getAdapterPosition();
photos.add(mAdapterPosition, mPhoto);
notifyItemInserted(mAdapterPosition);
recyclerView.scrollToPosition(mAdapterPosition);
photosToDelete.remove(mPhoto);
}
});
snackbar.show();
photos.remove(adapterPosition);
notifyItemRemoved(adapterPosition);
photosToDelete.add(mPhoto);
}

photosToDelete 是 myAdapter 的一个 ArrayList 字段。我正在 recyclerView 主机 fragment 的 onPause() 方法中真正删除这些项目。

注意编辑 2016/01/10:

  • 按照@Sourabh 在评论中的建议更改了硬编码位置
  • 有关带有 RV 的适配器和 fragment 的完整示例,请参阅 this gist

关于android - RecyclerView 中的确认和撤消删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850494/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com