如何解决RecyclerView列表图片在应用重启或新增数据后不显示的问题
问题修复方案
问题根源
- SortedList的
compare方法直接返回0,导致排序逻辑完全失效,新增/重新加载数据时列表元素无法正确定位、更新 - 直接调用
ImageView.setImageURI加载Uri存在多个缺陷:同步加载易卡顿、加载失败无回调、ViewHolder复用时易显示旧图、Content URI权限过期后无法加载 - 若
Note类未正确重写equals方法,areContentsTheSame判断异常,会导致数据变化时Adapter不触发item刷新 - 持久化存储的Uri未申请持久化权限/路径指向临时缓存,重启应用后无法访问对应资源
修复步骤
- 修正SortedList的排序逻辑,按你的业务需求实现
compare方法,示例如下:
@Override public int compare(Note o1, Note o2) { // 示例:按uid升序排序,可替换为创建时间、名称等业务字段 return Integer.compare(o1.uid, o2.uid); }
- 优化图片加载逻辑,推荐使用Glide等成熟图片加载库处理异步、权限、缓存问题:
// NoteViewHolder的bind方法修改为 public void bind (Note note) { this.note = note; textView.setText(note.text); Glide.with(itemView.getContext()) .load(note.img) .placeholder(R.drawable.loading_placeholder) // 可替换为你自己的加载中占位图 .error(R.drawable.load_failed) // 可替换为加载失败默认图 .into(imageView); }
如果不使用第三方库,原生加载请增加异常捕获、权限处理和复用优化:
public void bind (Note note) { this.note = note; uri = Uri.parse(note.img); textView.setText(note.text); // 先清空旧图,避免ViewHolder复用显示错误 imageView.setImageURI(null); // 申请Content URI持久化权限,避免重启后权限失效 if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) { try { itemView.getContext().getContentResolver() .takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION); } catch (SecurityException e) { e.printStackTrace(); } } try { imageView.setImageURI(uri); } catch (Exception e) { e.printStackTrace(); // 加载失败显示默认图 imageView.setImageResource(R.drawable.default_icon); } }
检查
Note类的equals和hashCode方法,确保按业务字段重写,不要使用默认的引用对比逻辑,保证areContentsTheSame判断准确。验证数据库存储的img字段有效性:如果是本地文件路径,确保文件存储在应用私有目录下,不要指向临时缓存路径;如果是系统 Content URI,存储前必须先申请持久化读取权限。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

