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

在RecyclerView.Adapter的onBindViewHolder中无法使用getRef获取Firebase数据key怎么办

问题原因

你当前使用的是原生RecyclerView.Adapter,getRef()方法是FirebaseUI组件库中FirebaseRecyclerAdapter的内置方法,自定义的普通Adapter不存在该方法,所以无法直接调用获取数据key。

解决方案(推荐,改动最小)

给你的Upload实体类新增key字段,在数据查询阶段就把每条数据的key存入Upload对象中,后续直接从列表读取即可,具体修改步骤如下:

  1. 修改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保留
}
  1. 修改你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) {
        // 自行处理数据库错误逻辑
    }
});
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:45:05