You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:52:46