从Firebase中检索数据但无法在listView中显示
问题描述:
这是我从Firebase获取数据的方法,但问题是存在大量数据,这就是为什么它需要大量时间并且没有返回列表。 ..从Firebase中检索数据但无法在listView中显示
public List<Message> retrieveDataFromDatabase() {
final List<Message> msg = new ArrayList<>();
Firebase itemsTodo = fb.child("Incomplete");
itemsTodo.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot children : dataSnapshot.getChildren()) {
for (DataSnapshot child : children.getChildren()) {
Map<String, Object> mapMsg = (Map<String, Object>) child.getValue();
boolean isRead = (Boolean) mapMsg.get("read");
String message = (String) mapMsg.get("sender");
String title = (String) mapMsg.get("title");
msg.add(new Message(title, message, isRead));
}
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});Log.d("Moosa", "Size From Database is "+msg.size());
return msg;
}`
并且有一个方法来显示列表视图从我打电话上述方法...
public void refreshListItems() {
Log.d("Moosa", "Invoke Refresh Method");
AsyncTask<Void,Void,List<Message>> refresh=new AsyncTask<Void, Void, List<Message>>() {
@Override
protected List<Message> doInBackground(Void... params) {
List<Message> msg=db.retrieveDataFromDatabase();
Log.d("Moosa", "Size is "+msg.size());
return msg;
}
@Override
protected void onPostExecute(List<Message> messages) {
Log.d("Moosa", "OnPostExecution Start.......");
super.onPostExecute(messages);
final ListView list = (ListView) findViewById(R.id.emailList);
final MessageAdapter msgadptr = new MessageAdapter(MainActivity.this, messages);
list.setAdapter(msgadptr);
Log.d("Moosa", "OnPostExecuted.......");
}
};
refresh.execute();
Log.d("Moosa", "Refreshing List...");
}
日志--->
穆萨:调用Refresh方法
穆萨:刷新列表...
穆萨:大小为0
穆萨:OnPostExecution开始.......
穆萨:OnPostExecuted .......
穆萨:规格从数据库是12
答
如果您发现您的logcat为了清楚地
首先是打印列表大小为0,但onPostExcute(-)
后它返回列表的大小为12.that意味着你retrieveDataFromDatabase()
将返回空列表和背景 Listener
加载数据,以便一旦装载完成,它就是printi ng列表大小为12.
即即在onDataChange(-)
中,只有您可以将数据添加到适配器并将其设置为ListView
。
希望这会帮助你。