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

RecyclerView.ViewHolder的setIsRecyclable配对规则及调用时机示例咨询

RecyclerView.ViewHolder setIsRecyclable 用法说明

成对调用的原因

setIsRecyclable(false)的作用是告知RecyclerView,当前ViewHolder正在被使用,不能回收给其他条目复用。如果仅调用false不配对调用true,该ViewHolder会被永久标记为不可复用,不仅会让RecyclerView失去复用特性,导致列表滑动时持续创建新ViewHolder引发卡顿,还会造成严重的内存泄漏问题。

调用setIsRecyclable(true)的时机

当你确定当前ViewHolder不再被对应条目占用时,就可以调用setIsRecyclable(true)重置标记,最稳妥的通用调用位置是onViewRecycled回调,该回调会在系统准备将ViewHolder放入复用池之前触发。
如果是因为ViewHolder内有正在执行的动画、异步请求才禁用回收,也可以在动画结束、异步请求完成的回调中提前调用setIsRecyclable(true),不需要等到回收触发,能提前释放复用权限提升列表性能。

示例代码

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {
    // 列表数据、构造方法等其他逻辑省略
    private List<DataModel> dataList;

    @Override
    public void onBindViewHolder(@NonNull CustomViewHolder holder, int position) {
        // 先完成视图绑定逻辑
        DataModel currentData = dataList.get(position);
        holder.titleText.setText(currentData.getTitle());
        // 其他绑定逻辑...
        
        // 标记当前ViewHolder不可回收
        holder.setIsRecyclable(false);

        // 示例:如果是因为动画才禁用回收,动画结束后提前重置标记
        holder.animView.animate()
            .alpha(1f)
            .setDuration(1000)
            .withEndAction(() -> {
                // 动画执行完成,恢复可回收标记
                holder.setIsRecyclable(true);
            })
            .start();
    }

    @Override
    public void onViewRecycled(@NonNull CustomViewHolder holder) {
        super.onViewRecycled(holder);
        // 兜底配对调用,不管之前有没有重置,回收时统一重置可回收标记
        holder.setIsRecyclable(true);
        // 可在这里补充资源释放逻辑:停止动画、取消图片加载请求等
    }

    // 手动移除条目的场景补充调用
    public void deleteItem(int position) {
        // 先获取待移除条目的ViewHolder,重置标记
        CustomViewHolder targetHolder = recyclerView.findViewHolderForAdapterPosition(position);
        if (targetHolder != null) {
            targetHolder.setIsRecyclable(true);
        }
        dataList.remove(position);
        notifyItemRemoved(position);
    }

    static class CustomViewHolder extends RecyclerView.ViewHolder {
        TextView titleText;
        View animView;
        public CustomViewHolder(@NonNull View itemView) {
            super(itemView);
            titleText = itemView.findViewById(R.id.title);
            animView = itemView.findViewById(R.id.anim_view);
        }
    }
}

注意:非必要场景不建议禁用ViewHolder回收,会大幅降低RecyclerView的运行性能。如果只是为了解决复用导致的视图状态错乱问题,优先在onBindViewHolder中主动重置所有View的状态即可,不需要直接禁用回收机制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:15:03