RecyclerView搜索过滤后行字体加粗状态残留问题
问题解决方案
问题根源
ViewHolder复用导致字体状态残留:当列表项被复用时,调用holder.name.setTypeface(holder.name.getTypeface(), Typeface.NORMAL)时,当前的Typeface已经是加粗状态,这种基于原有字体叠加样式的方式无法正确重置为常规样式。另外,你重写getItemViewType返回position的做法,是强制RecyclerView不复用ViewHolder,严重影响性能且完全没必要。
修复步骤
- 在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; } // 其余控件初始化代码保持不变... } // 其余代码保持不变... }
- 修改字体设置逻辑
在onBindViewHolder中,基于默认字体切换样式,确保每次设置都是干净的状态:
if (contactItem.isSumaContact()) { // 基于默认字体设置加粗样式 holder.name.setTypeface(holder.defaultNameTypeface, Typeface.BOLD); // 隐私图标相关逻辑保持不变... } else { // 直接使用默认常规字体,彻底重置样式 holder.name.setTypeface(holder.defaultNameTypeface); // 邀请按钮相关逻辑保持不变... }
- 移除不必要的代码
删除适配器中以下强制禁用复用的代码:
@Override public int getItemViewType(int position) { return position; }
修复原理
- 保存默认字体后,每次样式切换都基于原始常规字体,彻底避免复用导致的状态残留
- 恢复RecyclerView的ViewHolder复用机制,保证列表性能
- 直接使用默认字体设置常规样式,比叠加
Typeface.NORMAL的方式更可靠,确保样式完全重置
内容的提问来源于stack exchange,提问作者Suma Deliveries
相关产品推荐
相关产品推荐

