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

如何实现RecyclerView条目滑动后不消失并修改布局(显示TextView)

实现RecyclerView滑动后显示操作项(而非删除条目)

你遇到的问题是因为默认的ItemTouchHelper在触发onSwiped后会自动移除条目,但我们可以通过修改回调逻辑,结合数据状态保存来实现类似WhatsApp的滑动显示操作的效果。下面是具体的实现步骤:

步骤1:更新数据模型,保存操作项的可见状态

首先需要在你的MyModel类中添加一个字段,用来记录当前条目是否需要显示隐藏的TextView,这样在RecyclerView刷新时能保持状态:

public class MyModel {
    private int position;
    private boolean isActionVisible; // 新增:标记操作项是否可见

    // 原有构造方法、getter/setter
    public MyModel(int position) {
        this.position = position;
        this.isActionVisible = false; // 默认隐藏
    }

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }

    public boolean isActionVisible() {
        return isActionVisible;
    }

    public void setActionVisible(boolean actionVisible) {
        isActionVisible = actionVisible;
    }
}

步骤2:修改Adapter,绑定操作项的可见状态

在MyAdapter的onBindViewHolder方法中,根据MyModel的状态来设置txt2的可见性,确保条目刷新时状态不会丢失:

@Override 
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { 
    MyModel myModel = list.get(position); 
    holder.txt1.setText(String.valueOf(myModel.getPosition())); 
    // 根据模型状态设置txt2的可见性
    holder.txt2.setVisibility(myModel.isActionVisible() ? View.VISIBLE : View.INVISIBLE);
}

// 新增:提供获取条目的方法,方便外部修改状态
public MyModel getItem(int position) {
    return list.get(position);
}

步骤3:修改ItemTouchHelper回调,阻止条目删除并触发显示操作

现在调整你的swipe()方法中的回调逻辑,取消默认的删除行为,改为更新数据状态并刷新条目,同时恢复条目的原始位置:

public void swipe () { 
    ItemTouchHelper.Callback itemTouch = new ItemTouchHelper.Callback() { 
        @Override 
        public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { 
            int dragFlag = ItemTouchHelper.ACTION_STATE_IDLE; 
            int swipeFlag = ItemTouchHelper.START | ItemTouchHelper.END; 
            return makeMovementFlags(dragFlag, swipeFlag); 
        } 

        @Override 
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) { 
            return false; 
        } 

        @Override 
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) { 
            // 获取当前条目的位置和模型
            int adapterPosition = viewHolder.getAdapterPosition();
            MyModel model = myAdapter.getItem(adapterPosition);
            
            // 标记操作项为可见
            model.setActionVisible(true);
            // 刷新条目,更新UI
            myAdapter.notifyItemChanged(adapterPosition);
            
            // 重置条目位置,避免停留在滑动后的偏移状态
            viewHolder.itemView.setTranslationX(0);
        }

        @Override
        public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
            super.clearView(recyclerView, viewHolder);
            // 确保滑动结束后条目完全回到原始位置
            viewHolder.itemView.setTranslationX(0);
        }

        // 可选:自定义滑动触发阈值(比如滑动超过30%宽度就触发操作)
        @Override
        public float getSwipeThreshold(@NonNull RecyclerView.ViewHolder viewHolder) {
            return 0.3f;
        }
    }; 
    new ItemTouchHelper(itemTouch).attachToRecyclerView(recyclerView); 
}

为什么这样做?

  • 我们通过在数据模型中保存isActionVisible状态,确保RecyclerView刷新(比如滑动、滚动)时,操作项的可见性不会丢失。
  • 重写clearView和手动设置translationX(0),保证滑动结束后条目回到原始位置,不会停留在滑动偏移状态。
  • 在onSwiped中不执行删除数据的操作,而是更新模型状态并刷新条目,这样就实现了滑动后显示操作项而非删除条目的效果。

内容的提问来源于stack exchange,提问作者Bruno Baccho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:47:59