存于Firebase的HashMap取出首个图片值结果随机的问题如何解决
问题根源
- Java原生
HashMap不维护元素的插入顺序,直接调用values().iterator().next()获取的元素是随机的 - Firebase Realtime Database的默认序列化/反序列化也不会保留Map的插入顺序
- 你当前直接把取出的Foto对象转String加载的写法也存在问题,会拿到对象内存地址而非图片URL,大概率会加载失败
解决方案
方案1:利用Firebase Push ID的时间特性排序(无需修改存储逻辑)
你当前用的idFoto是Firebase生成的Push ID,这类ID本身按生成时间递增排序,只要对所有key做升序排序,取第一个key对应的图片就是最早上传的第一张:
修改Adapter.java代码:
HashMap<String, Object> urlFotos = pet.getFotos(); // 把所有key转成列表后升序排序 List<String> sortedKeys = new ArrayList<>(urlFotos.keySet()); Collections.sort(sortedKeys); // 取排序后的第一个key对应的图片对象,取出url加载 Foto firstFoto = (Foto) urlFotos.get(sortedKeys.get(0)); Picasso.get().load(firstFoto.getUrlFoto()).into(holder.foto);
方案2:存储时显式标记序号(更稳定,支持自定义排序)
如果后续需要支持用户调整图片顺序,建议存的时候给每个图片加order字段标记序号,取的时候直接找order=0的即可:
- 修改Cadastrar.java存储逻辑
private HashMap<String, Object> fotosSelecionadas = new HashMap<>(); // 遍历选中的图片,给每个加上顺序标记 List<Foto> selectedFotoList = 你选中的图片列表; for (int i = 0; i < selectedFotoList.size(); i++) { Foto foto = selectedFotoList.get(i); foto.setOrder(i); // 新增order字段,0对应第一张 fotosSelecionadas.put(foto.getIdFoto(), foto); } pet.setFotos(fotosSelecionadas); pet.salvar();
- 修改Adapter.java读取逻辑
HashMap<String, Object> urlFotos = pet.getFotos(); Foto firstFoto = null; for (Object obj : urlFotos.values()) { Foto foto = (Foto) obj; if (foto.getOrder() == 0) { firstFoto = foto; break; } } if (firstFoto != null) { Picasso.get().load(firstFoto.getUrlFoto()).into(holder.foto); }
内容的提问来源于stack exchange,提问作者Barraviera
相关产品推荐
相关产品推荐

