如何为RecyclerView指定Item禁用侧滑删除功能
解决RecyclerView侧滑删除根据Username禁用指定Item的问题
嘿,这个问题我之前也碰到过,核心就是得让你的SwipeHelper能获取到每个Item对应的username数据,这样就能在判断侧滑权限时做针对性处理了。下面是具体的实现方案:
步骤1:修改SwipeHelper类,让它持有Adapter/数据源
我们需要给SwipeHelper传递RecyclerView的Adapter(或者直接持有数据源列表),这样就能通过Item的position拿到对应的username:
public class SwipeHelper extends ItemTouchHelper.SimpleCallback { private RecyclerView.Adapter mAdapter; // 构造方法接收Adapter参数 public SwipeHelper(int dragDirs, int swipeDirs, RecyclerView.Adapter adapter) { super(dragDirs, swipeDirs); this.mAdapter = adapter; } // 重写getSwipeDirs方法,动态控制侧滑权限 @Override public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) { int position = viewHolder.getAdapterPosition(); // 注意:这里需要把强转成你的自定义Adapter(比如UserAdapter) User currentUser = ((UserAdapter) mAdapter).getItem(position); // 判断如果是指定的username,就返回0(完全禁用侧滑) if ("需要禁用的用户名".equals(currentUser.getUsername())) { return 0; } // 其他情况返回原来的侧滑方向 return super.getSwipeDirs(recyclerView, viewHolder); } // 保留你原有的onMove逻辑 @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { // 你的原有代码,比如处理拖拽排序(如果不需要可以返回false) return false; } // 保留你原有的onSwiped逻辑 @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { // 你的侧滑删除处理代码,比如移除数据源、通知Adapter更新 int position = viewHolder.getAdapterPosition(); ((UserAdapter) mAdapter).removeItem(position); } }
步骤2:初始化SwipeHelper时传入Adapter实例
在你设置RecyclerView侧滑功能的地方,把自定义的Adapter传进去:
// 假设你的自定义Adapter实例是userAdapter ItemTouchHelper.SimpleCallback itemTouchHelperCallback = new SwipeHelper(0, ItemTouchHelper.LEFT, userAdapter); new ItemTouchHelper(itemTouchHelperCallback).attachToRecyclerView(recyclerView);
可选:隐藏禁用侧滑Item的删除按钮
如果只是禁用侧滑还不够,你还可以在onChildDraw方法里控制,让禁用侧滑的Item完全不显示删除背景/按钮:
@Override public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { int position = viewHolder.getAdapterPosition(); User currentUser = ((UserAdapter) mAdapter).getItem(position); // 只有非禁用的Item才绘制侧滑效果 if (!"需要禁用的用户名".equals(currentUser.getUsername())) { super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); } }
原理说明
getSwipeDirs方法是ItemTouchHelper用来判断当前Item允许哪些侧滑方向的核心方法,返回0就表示完全禁用侧滑。通过给SwipeHelper传递Adapter,我们就能通过ViewHolder的getAdapterPosition()拿到对应位置的数据,进而根据username做动态判断。
内容的提问来源于stack exchange,提问作者user2269164
相关产品推荐
相关产品推荐

