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

如何从Firebase Realtime Database按UID获取数据并展示到ListView?

Firebase实时数据库数据检索与ListView展示问题及UID筛选实现

问题说明

  • 数据已成功存入Firebase实时数据库,但无法检索并展示到ListView组件中
  • 需要实现基于用户唯一UID筛选特定用户数据的功能

现有代码

MainPageActivity

public class MainPageActivity extends AppCompatActivity {

    private FirebaseAuth mAuth;
    private DatabaseReference mDatabase;
    private ArrayList<Reminder> mReminderList;
    private ReminderAdapter mReminderAdapter;
    private ListView mReminderListView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_page);
    }

}

ReminderAdapter

public class ReminderAdapter extends ArrayAdapter<Reminder> {
private Context context;
private int resource;
private ArrayList<Reminder> remindersList;

    public ReminderAdapter(Context context, int resource, ArrayList<Reminder> remindersList) {
        super(context, resource, remindersList);
        this.context = context;
        this.resource = resource;
        this.remindersList = remindersList;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(context).inflate(resource, parent, false);
        }
    
        TextView reminderTitle = convertView.findViewById(R.id.aTitle);
        TextView reminderdate = convertView.findViewById(R.id.aDate);
        TextView reminderTime = convertView.findViewById(R.id.aTime);
    
        Reminder reminder = remindersList.get(position);
    
        reminderTitle.setText(reminder.getTitle());
        reminderdate.setText(reminder.getDate());
        reminderTime.setText(reminder.getTime());
    
        return convertView;
    }


}  

Reminder实体类

public class Reminder {
String time;
String title;
String date;
String uid;
String key;

    public Reminder() {
        // Empty constructor required for Firebase
    }
    
    public Reminder(String title, String date, String time, String uid, String key) {
        this.title = title;
        this.date = date;
        this.time = time;
        this.uid = uid;
        this.key = key;
    }
    public String getUid() {
        return uid;
    }
    
    public void setUid(String uid) {
        uid = uid;
    }
    
    public String getKey() {
        return key;
    }
    
    public void setKey(String key) {
        key = key;
    }
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    public String getDate() {
        return date;
    }
    
    public void setDate(String date) {
        this.date = date;
    }
    
    public String getTime() {
        return time;
    }
    
    public void setTime(String time) {
        this.time = time;
    }

}

数据库结构参考

Realtime Database结构

解决方案

1. 修复实体类Setter方法错误

Reminder类的setUid和setKey方法存在变量名冲突,导致UID和Key无法正确赋值,修改如下:

public void setUid(String uid) {
    this.uid = uid;
}

public void setKey(String key) {
    this.key = key;
}

2. 初始化组件并添加数据监听

在MainPageActivity的onCreate方法中完成Firebase组件初始化、ListView配置,并添加带UID筛选的数据监听:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_page);

    // 初始化FireAuth和Database引用
    mAuth = FirebaseAuth.getInstance();
    mDatabase = FirebaseDatabase.getInstance().getReference("reminders");
    
    // 初始化ListView和数据集合
    mReminderList = new ArrayList<>();
    mReminderListView = findViewById(R.id.your_listview_id); // 替换为布局中实际的ListView ID
    mReminderAdapter = new ReminderAdapter(this, R.layout.your_list_item_layout, mReminderList); // 替换为列表项布局ID
    mReminderListView.setAdapter(mReminderAdapter);

    // 获取当前用户UID并筛选数据
    if (mAuth.getCurrentUser() != null) {
        String currentUid = mAuth.getCurrentUser().getUid();
        
        mDatabase.orderByChild("uid").equalTo(currentUid)
                .addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        mReminderList.clear();
                        for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                            Reminder reminder = dataSnapshot.getValue(Reminder.class);
                            if (reminder != null) {
                                reminder.setKey(dataSnapshot.getKey());
                                mReminderList.add(reminder);
                            }
                        }
                        mReminderAdapter.notifyDataSetChanged();
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {
                        Log.e("FirebaseError", error.getMessage());
                    }
                });
    }
}

3. 数据库规则配置

确保Firebase实时数据库规则允许当前用户读写自己的数据:

{
  "rules": {
    "reminders": {
      ".read": "auth != null && auth.uid == data.child('uid').val()",
      ".write": "auth != null && auth.uid == newData.child('uid').val()"
    }
  }
}

内容的提问来源于stack exchange,提问作者Bart

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 13:30:40