我目前正在创建一个应用程序,它在实时数据库中记录一个6位数的int id(值)和它们被记录的时间/日期(键)。我试图通过将数据库键值列为列表中的项目来创建一个单独的应用程序,并使用搜索查询来搜索id。
我的问题是,我应该如何检索并列出我的listView中的项目键和值?这些项目也需要实时添加,因此可以像在Firebase控制台中一样查看它们。谢谢!
答案 0 :(得分:1)
public ArrayList<String> arr;
public ArrayAdapter adapter;
@Override
protected void onStart() {
super.onStart();
DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference();
arr = new ArrayList<>();
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
map2list((Map) dataSnapshot.getValue());
//formats the datasnapshot entries to strings
adapter.notifyDataSetChanged();
//makes the ListView realtime
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
System.out.println(databaseError.toException());
// ...
}
};
mDatabase.addValueEventListener(listener);
adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, android.R.id.text1, arr);
ListView listView = (ListView) findViewById(R.id.yourOwnListView);
listView.setAdapter(adapter);
}
public void map2list(Map<String,Long> map){
arr.clear();
for (Map.Entry<String, Long> entry : map.entrySet()) {
Long key = Long.parseLong(entry.getKey());
String d = DateFormat.getDateTimeInstance().format(key);
Long value = entry.getValue();
arr.add(d + ": " + value);
}
}
我在自己的数据库上测试了它,但它确实有用。
map2list()是我为listview格式化数据的快捷方式。最好的方法是使用自定义arrayadapter或baseadapter,但这涉及的代码多于此示例所需的代码。
请注意,将密钥保留为时间是一个坏主意,因为如果同时制作两个日志,您可能会发生冲突。
最后,firebase使用Longs而不是整数,所以我使用Longs来减少代码