我是Firebase的初学者。要在我的Android应用程序中创建类似排行榜的列表,我在firebase上设置了一个数据库,如下所示:
其中所有userUID都位于“users”节点下,并且每个userUID节点下都是用户的数据。我试图使用Query类方法访问具有前3个最高“totalIMPs”值的3个用户,并在Listview(list_TotalIMPs)上显示他们的“名称”。为此,我尝试了以下代码:
final ArrayAdapter<String> adapter_totalIMPs=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,android.R.id.text1);
list_TotalIMPs=(ListView)findViewById(R.id.listView_TotalIMPs);
list_TotalIMPs.setAdapter(adapter_totalIMPs);
Query query1=databaseReference.child("users").orderByChild("totalIMPs").limitToLast(3);
query1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
adapter_totalIMPs.clear();
adapter_totalIMPs.add("1");//for testing
adapter_totalIMPs.add("2");//for testing
adapter_totalIMPs.add("3");//for testing
for(DataSnapshot postsnapshot:dataSnapshot.getChildren())
{
adapter_totalIMPs.add((String)postsnapshot.child("name").getValue());
Toast.makeText(MainActivity.this,"Add in list: "+(String)postsnapshot.child("name").getValue(),Toast.LENGTH_LONG).show();
}
}
@Override public void onCancelled(DatabaseError databaseError){Toast.makeText(MainActivity.this,"Add in list: CANCELLED",Toast.LENGTH_LONG).show();}
});
但是,只有测试字符串“1”,“2”和“3”出现在我的列表中,而且,没有Toast显示。这意味着在“for”循环中出现问题,我想这与数据库结构有关。但是我在解决这个问题时遇到了问题。有人可以帮忙吗?非常感谢你。
(我想知道数据快照是否为空,以至于从未输入“for”循环?)
答案 0 :(得分:1)
您正在设置适配器正在读取数据。尝试在onChange方法中设置适配器:
Query query1=databaseReference.child("users").orderByChild("totalIMPs").limitToLast(3);
query1.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
adapter_totalIMPs.clear();
adapter_totalIMPs.add("1");//for testing
adapter_totalIMPs.add("2");//for testing
adapter_totalIMPs.add("3");//for testing
for(DataSnapshot postsnapshot:dataSnapshot.getChildren())
{
adapter_totalIMPs.add((String)postsnapshot.child("name").getValue());
Toast.makeText(MainActivity.this,"Add in list: "+(String)postsnapshot.child("name").getValue(),Toast.LENGTH_LONG).show();
}
list_TotalIMPs.setAdapter(adapter_totalIMPs);
}
@Override public void onCancelled(DatabaseError databaseError){Toast.makeText(MainActivity.this,"Add in list: CANCELLED",Toast.LENGTH_LONG).show();}
});