[英]NotifyDataSetChanged doesn't update if it isn't in the loop adding the data
我正在使用Firebase數據更新基本排行榜ListView。 每當任何用戶得分變化時,它都會更新。
我有一個listView:
ListView lvLeaderboard;
lvLeaderboard = findViewById(R.id.lvLeaderboard);
ArrayList: ArrayList<String> userLeaderboardStrings = new ArrayList<>();
ArrayAdapter:
ArrayAdapter<String> leaderboardAdapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, userLeaderboardStrings);
數據加載正常。 問題是,如果我不將leaderboardAdapter.notifyDatSetChanged()
放在迭代firebase數據並將其添加到適配器的循環中,則它將不會更新。
但是,我將其排除在循環之外的原因是,一旦所有數據加載完畢,就更新列表。
看,我的第一種方法是在查詢數據庫之前清除列表:
leaderboardAdapter.clear();
然后查詢每個用戶的數據。 這留下了一個小窗口,根本沒有繪制ListView,因為正在獲取數據。 加上Firebase數據更新速度超級快(您點擊按鈕以提高得分,因此您可以盡可能快地點擊它),它總是在更新,因此總是閃爍不亮,顯示時間不會超過十分之一秒。
但是將其添加到快照迭代器之外不會運行它。
加載所有數據后,如何刷新列表視圖?
//NOTE: this is all in an enclosing valueEventListener onDataChange Method
userLeaderboardStrings.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
usersListRef.child(snapshot.getKey()).addListenerForSingleValueEvent(new
ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Map<String, Object> userCredMap = (Map<String, Object>)
dataSnapshot.getValue();
userLeaderboardStrings.add(just the name + score);
leaderboardAdapter.notifyDataSetChanged(); // This line
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
//I wanna put the notifyDataSetChanged Here. It wont work
userLeaderboardStrings.clear();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
usersListRef.child(snapshot.getKey()).addListenerForSingleValueEvent(new
ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Map<String, Object> userCredMap = (Map<String, Object>)
dataSnapshot.getValue();
userLeaderboardStrings.add(just the name + score);
leaderboardAdapter.notifyDataSetChanged(); // This line
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
此事件addListenerForSingleValueEvent異步運行,對於每次迭代,它將創建一個addListenerForSingleValueEvent的新實例,並在每次成功調用onDataChange之后通知ListView。
因此,將其放置在循環中時工作正常。
但是,如果您希望它不在循環中,那么在這種情況下,您必須檢查所有的addListenerForSingleValueEvent是否都已完成,並且在完成之后,您需要通知該列表。 但是這種方法似乎不是非常有效和有效。
您上面所做的一切都很好。 希望您理解我在上面試圖解釋的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.