簡體   English   中英

如果NotifyDataSetChanged不在循環中添加數據,則不會更新

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM