如何获取RecyclerView中Firebase加载项的Key?getRef方法无法解析
解决RecyclerView点击获取Firebase用户ID的问题
你遇到的getRef()无法解析的问题,是因为这个方法是FirebaseUI库中的FirebaseRecyclerAdapter自带的,而你现在是自己用ChildEventListener手动加载数据到ArrayList,自定义的MyAdapter并没有这个方法。下面给你两种简单可行的解决方案:
方案一:给Students类添加userId字段(推荐)
这种方式最直观,把每个用户的Firebase节点ID直接绑定到对应的Students对象上:
- 首先修改你的
Students实体类,添加userId属性和对应的getter/setter:
public class Students { // 原有的字段:name, programme, online, thumb_image等 private String userId; // 新增字段 // Firebase解析需要空构造函数,必须保留 public Students() {} // 其他构造函数和原有字段的getter/setter public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } }
- 在
onChildAdded方法中,把Firebase节点的key赋值给Students对象:
@Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Students students = dataSnapshot.getValue(Students.class); // 新增这行,将当前Firebase节点的ID赋值给students对象 students.setUserId(dataSnapshot.getKey()); listData.add(students); recyclerView.setAdapter(adapter); progressDialog.dismiss(); }
- 然后在Adapter的
onBindViewHolder里,直接从students对象获取userId:
@Override public void onBindViewHolder(final StudentsList.MyAdapter.ViewHolder holder, final int position) { Students students = list.get(position); // 直接通过对象获取userId final String list_user_id = students.getUserId(); holder.news_topic.setText(students.getName()); holder.news_body.setText(students.getProgramme()); // ... 原有状态判断和图片加载代码 holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent chat_intent = new Intent(StudentsList.this, ChatActivity.class); chat_intent.putExtra("user_id", list_user_id ); startActivity(chat_intent); } }); }
方案二:单独维护一个存储userId的列表
如果不想修改Students类,可以单独创建一个ArrayList来保存每个项的userId,和你的listData一一对应:
- 在StudentsList类中添加新的列表:
List<Students> listData; List<String> userIdList; // 新增列表,存储每个学生的Firebase节点ID
- 在onCreate里初始化:
listData = new ArrayList<>(); userIdList = new ArrayList<>(); // 初始化userId列表 adapter = new StudentsList.MyAdapter(listData);
- 在
onChildAdded中同步添加userId到列表:
@Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Students students = dataSnapshot.getValue(Students.class); listData.add(students); userIdList.add(dataSnapshot.getKey()); // 将节点ID加入对应列表 recyclerView.setAdapter(adapter); progressDialog.dismiss(); }
- 在Adapter的点击事件中,根据position取对应的userId:
holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String targetUserId = userIdList.get(position); Intent chat_intent = new Intent(StudentsList.this, ChatActivity.class); chat_intent.putExtra("user_id", targetUserId ); startActivity(chat_intent); } });
⚠️ 注意:如果后续有数据更新(比如onChildChanged、onChildRemoved),记得同步更新userIdList,保证两个列表的位置始终对应。
另外,你的Adapter代码看起来没写完,补全onCreateViewHolder和ViewHolder的定义:
@NonNull @Override public StudentsList.MyAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 替换成你的列表项布局ID View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_student, parent, false); return new ViewHolder(view); } public class ViewHolder extends RecyclerView.ViewHolder { TextView news_topic, news_body; CircleImageView news_image; ImageView online; public ViewHolder(View itemView) { super(itemView); // 替换成你布局中对应的控件ID news_topic = itemView.findViewById(R.id.tv_student_name); news_body = itemView.findViewById(R.id.tv_student_programme); news_image = itemView.findViewById(R.id.iv_student_avatar); online = itemView.findViewById(R.id.iv_online_status); } }
这样修改后,点击列表项就能正确获取到对应用户的userId,传递到ChatActivity后就可以设置ActionBar的标题啦~
内容的提问来源于stack exchange,提问作者user8581525
相关产品推荐
相关产品推荐

