ListView项点击获取用户唯一ID失败,getRef方法报错求助
解决ListView点击获取Firebase用户ID的问题
嘿,我来帮你搞定这个问题!你碰到的cannot resolve symbol getRef报错,核心原因是**getRef(position)并不是普通ValueEventListener或自定义ListView适配器里的方法**——它是FirebaseUI库中FirebaseListAdapter/FirebaseRecyclerAdapter的专属方法。下面给你拆解两种可行的解决方案:
方案一:用FirebaseUI的FirebaseListAdapter(推荐,最省心)
FirebaseUI已经帮你封装了数据监听、key存储的逻辑,直接用它就能轻松获取点击项的用户ID:
1. 先添加FirebaseUI依赖
在模块级别的build.gradle里加入(注意版本要和你的Firebase核心依赖匹配):
dependencies { // FirebaseUI 数据库适配器 implementation 'com.firebaseui:firebase-ui-database:8.0.0' // Firebase BOM 统一管理版本 implementation platform('com.google.firebase:firebase-bom:32.7.0') implementation 'com.google.firebase:firebase-database' }
2. 完整代码示例
private ListView userListView; private FirebaseListAdapter<User> userAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_list); userListView = findViewById(R.id.list_view_users); DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("Users"); // 初始化FirebaseListAdapter userAdapter = new FirebaseListAdapter<User>(this, User.class, android.R.layout.simple_list_item_1, usersRef) { @Override protected void populateView(View view, User userModel, int position) { // 把用户数据显示到列表项上,比如显示用户名 TextView userNameTv = view.findViewById(android.R.id.text1); userNameTv.setText(userModel.getName()); } }; userListView.setAdapter(userAdapter); // 列表点击事件:直接用adapter.getRef(position)拿ID userListView.setOnItemClickListener((parent, view, position, id) -> { String userId = userAdapter.getRef(position).getKey(); Toast.makeText(this, "点击的用户ID:" + userId, Toast.LENGTH_SHORT).show(); // 这里可以用userId做后续操作,比如跳转用户详情页 }); } // 页面生命周期管理:避免内存泄漏 @Override protected void onStart() { super.onStart(); userAdapter.startListening(); } @Override protected void onStop() { super.onStop(); userAdapter.stopListening(); }
方案二:自己手动存储用户ID(不用FirebaseUI的情况)
如果不想引入FirebaseUI,你可以在获取数据时,把每个用户的ID和数据一起保存,之后通过列表位置匹配:
1. 定义用户实体类
public class User { private String name; private String email; // Firebase序列化必须要有无参构造 public User() {} public User(String name, String email) { this.name = name; this.email = email; } // getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
2. 完整代码示例
private ListView userListView; private List<User> userDataList; private List<String> userKeyList; private ArrayAdapter<User> userAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_user_list); userListView = findViewById(R.id.list_view_users); userDataList = new ArrayList<>(); userKeyList = new ArrayList<>(); // 自定义适配器显示用户数据 userAdapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, userDataList) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView userNameTv = view.findViewById(android.R.id.text1); userNameTv.setText(userDataList.get(position).getName()); return view; } }; userListView.setAdapter(userAdapter); // 监听Firebase用户数据 DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("Users"); usersRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { userDataList.clear(); userKeyList.clear(); // 遍历每个用户快照,同时保存数据和ID for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { String userId = userSnapshot.getKey(); User user = userSnapshot.getValue(User.class); userDataList.add(user); userKeyList.add(userId); } userAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { Log.e("FirebaseError", "数据获取失败:" + databaseError.getMessage()); } }); // 列表点击事件:通过位置取对应的用户ID userListView.setOnItemClickListener((parent, view, position, id) -> { String userId = userKeyList.get(position); Toast.makeText(this, "点击的用户ID:" + userId, Toast.LENGTH_SHORT).show(); }); }
为什么之前的代码找不到getRef?
你之前尝试的getRef(position)是FirebaseUI适配器为了简化开发提供的方法,普通的ValueEventListener或者自定义ArrayAdapter并没有这个方法——因为它们没有帮你自动关联每个列表项对应的Firebase数据引用。
内容的提问来源于stack exchange,提问作者user9493136
相关产品推荐
相关产品推荐

