我遇到问题,在我的Android应用程序的listview上显示我的firebase上的.child项目。
当我使用以下代码时:
String value = dataSnapshot.child("messages").getValue(String.class);
list.add(value);
adapter.notifyDataSetChanged();
我能够检索数据,但是当对firebase进行更改时,将删除所有数据并显示新条目。
我希望能够从数据库中检索.child条目,例如
fDatabase.child("messages").child("message").addChildEventListener(new ChildEventListener()
我只希望它显示,更新和更改子消息。
有人可以帮助我,与数据库的连接很好,应用程序没有崩溃。因为不活动而断开连接。
这可能是firebase上的权限吗?
我的firebase规则目前已公开,我知道了
{
"rules": {
"messages":{
".read": true,
".write":true,
}
}
}
有什么建议吗?
我的代码
public class MainActivity extends AppCompatActivity {
DatabaseReference fDatabase;
ListView listview;
ArrayList<String> list = new ArrayList<>();
ArrayAdapter <String> adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
listview.setAdapter(adapter);
fDatabase = FirebaseDatabase.getInstance().getReference();
fDatabase.child("messages").child("message").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String value = dataSnapshot.child("messages").getValue(String.class);
adapter.add((String)dataSnapshot.child("messages").getValue());
list.add(value);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
adapter.clear();
adapter.add((String)dataSnapshot.child("messages").getValue());
String value = dataSnapshot.child("messages").getValue(String.class);
list.add(value);
adapter.notifyDataSetChanged();
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
我已经看过这个问题,但无法让它工作
Get child ID from Firebase android
当我将代码更改为事件监听器时,我得到null:null:null
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview = (ListView) findViewById(R.id.listview);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line);
listview.setAdapter(adapter);
fDatabase = FirebaseDatabase.getInstance().getReference();
fDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot messageSnapshot : dataSnapshot.getChildren()) {
adapter.clear();
String temp = (String) messageSnapshot.child("temp").getValue();
String humi = (String) messageSnapshot.child("humi").getValue();
String status = (String) messageSnapshot.child("status").getValue();
adapter.add(humi + " : " + temp + " : " + status);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
数据库结构
jmproject-*****
humi: "77"
status: "true"
temp: "24c"
数据库规则
{
"rules": {
".read": true,
".write":true,
}
}
答案 0 :(得分:0)
您正在覆盖邮件子项下的数据。您正在寻找的是dataSnapshot.getChildren(),它将返回所有子项的列表。您的实施问题是您只是在&#34;消息&#34;下存储孩子。键。如果要存储多个值,则每次存储消息时都需要更改密钥。
如果您想自动生成密钥,可以使用此
String key = firebaseRef.child("messages").push().getKey();
这将在/ messages / path下创建一个新的唯一条目。然后,您可以使用此密钥保存数据。
答案 1 :(得分:0)
我认为问题在于您是在oncrete方法中设置适配器而不是onChildAdded和onChildChanged方法。您应该在childEventListener方法中放置 listView.setAdapter(adapter)。此外,ChildAdded和ChildChanged中的代码也是多余的。将代码放在方法中,并从事件监听器方法中调用该方法。