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

RecyclerView搜索过滤后行字体加粗状态残留问题

问题解决方案

问题根源

ViewHolder复用导致字体状态残留:当列表项被复用时,调用holder.name.setTypeface(holder.name.getTypeface(), Typeface.NORMAL)时,当前的Typeface已经是加粗状态,这种基于原有字体叠加样式的方式无法正确重置为常规样式。另外,你重写getItemViewType返回position的做法,是强制RecyclerView不复用ViewHolder,严重影响性能且完全没必要。

修复步骤

  1. 在ViewHolder中保存默认常规字体
    修改ViewHolder类,添加成员变量存储默认字体,避免依赖复用后的字体状态:
public class ViewHolder extends RecyclerView.ViewHolder {
    private TextView name;
    private TextView phoneNumber;
    private ImageView image;
    private ImageView verificationIcon;
    private Button inviteButton;
    private ImageView publicIcon;
    private ImageView privateIcon;
    private ImageView allowedIcon;
    // 新增:存储默认常规字体
    private Typeface defaultNameTypeface;

    public ViewHolder(@NonNull View itemView, Context ctx) {
        super(itemView);
        context = ctx;
        name = itemView.findViewById(R.id.recipientsCRowNameID);
        // 初始化默认字体,兜底使用系统默认字体
        defaultNameTypeface = name.getTypeface();
        if (defaultNameTypeface == null) {
            defaultNameTypeface = Typeface.DEFAULT;
        }
        // 其余控件初始化代码保持不变...
    }
    // 其余代码保持不变...
}
  1. 修改字体设置逻辑
    在onBindViewHolder中,基于默认字体切换样式,确保每次设置都是干净的状态:
if (contactItem.isSumaContact()) {
    // 基于默认字体设置加粗样式
    holder.name.setTypeface(holder.defaultNameTypeface, Typeface.BOLD);
    // 隐私图标相关逻辑保持不变...
} else {
    // 直接使用默认常规字体,彻底重置样式
    holder.name.setTypeface(holder.defaultNameTypeface);
    // 邀请按钮相关逻辑保持不变...
}
  1. 移除不必要的代码
    删除适配器中以下强制禁用复用的代码:
@Override
public int getItemViewType(int position) {
    return position;
}

修复原理

  • 保存默认字体后,每次样式切换都基于原始常规字体,彻底避免复用导致的状态残留
  • 恢复RecyclerView的ViewHolder复用机制,保证列表性能
  • 直接使用默认字体设置常规样式,比叠加Typeface.NORMAL的方式更可靠,确保样式完全重置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:35:27