在RecyclerView.Adapter的onBindViewHolder中无法使用getRef获取Firebase数据key怎么办
问题原因
你当前使用的是原生RecyclerView.Adapter,getRef()方法是FirebaseUI组件库中FirebaseRecyclerAdapter的内置方法,自定义的普通Adapter不存在该方法,所以无法直接调用获取数据key。
解决方案(推荐,改动最小)
给你的Upload实体类新增key字段,在数据查询阶段就把每条数据的key存入Upload对象中,后续直接从列表读取即可,具体修改步骤如下:
- 修改Upload实体类,新增key属性及对应的get、set方法
public class Upload { // 你原来的其他属性:mName、mDescription、mImageUrl等 private String key; // 保留你原来的构造方法,Firebase反序列化需要空构造 public Upload() {} // 新增getter、setter public String getKey() { return key; } public void setKey(String key) { this.key = key; } // 你原来的其他getter、setter保留 }
- 修改你Activity/Fragment中查询Firebase数据填充列表的逻辑,遍历快照时将key赋值给Upload对象
// 你原有查询upload节点的逻辑中,新增一行赋值key的代码 mDatabaseRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { mUploads.clear(); for (DataSnapshot ds : snapshot.getChildren()) { Upload upload = ds.getValue(Upload.class); // 新增这行,将当前快照的key存入upload对象 upload.setKey(ds.getKey()); mUploads.add(upload); } // 刷新Adapter imageAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 自行处理数据库错误逻辑 } });
- 修改Adapter中onBindViewHolder的key获取逻辑
把原来的final String productKey = getRef(position).getKey();替换为:
final String productKey = mUploads.get(position).getKey();
修改完成后你原有页面跳转、下一个页面根据key查询数据的逻辑完全不需要改动,即可正常运行。
备选方案(无需修改实体类)
如果不想修改Upload实体类,可额外创建一个List<String> mProductKeys集合,和mUploads一一对应存储每条数据的key,在构造Adapter时将该集合传入,后续在onBindViewHolder中直接通过mProductKeys.get(position)获取对应key即可。
内容的提问来源于stack exchange,提问作者Ranko Koturic
相关产品推荐
相关产品推荐

