簡體   English   中英

如何從Firebase更新ListView

[英]How to update ListView from firebase

我正在使用firebase檢索一些數據作為字符串數組並將其顯示在列表視圖中。

問題是我將Firebase放在單獨的類中,因此我需要知道如何在MainActivity中更新列表視圖

這是我的數據庫類

    public void GetAllOsr (final ArrayList<String>names){

    // initialize firestore
    firebaseFirestore = FirebaseFirestore.getInstance();
    //Collection (osar) -> all documents
    firebaseFirestore.collection("Osar").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()){
                // for all documents in it get field name and store it in the arraylist
                for (QueryDocumentSnapshot document : task.getResult()) {
                    String name = document.getString("Name");
                    names.add(name);
                }
            }
        }

    });
}

這是我的MainActivity

@Override
protected void onStart() {
    super.onStart();

    final ArrayList<String> osarName = new ArrayList<>();
    dataBaseController.GetAllOsr(osarName);

    ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1, osarName);
    osar_list.setAdapter(adapter);

}

因此,如果它們在不同的類中,則需要某種方式來公開更新ListView的能力。 例如,在一個類中,您可以使用“獲取器”使ListView及其數據源對外界可見,即

public final ListView getMyListView() {
  return this.mListView;
}

publc final List<String> getMyListViewDataSource() {
  return this.mListViewDataSource;
}

這將允許您append項目appendmListViewDataSource ,完成后,在ListViewAdapter上調用notifyDatasetChanged()以強制Android識別列表內容已更改。

但是,這並不理想 這是因為您可以在應用程序中的任何位置訪問List的內容並任意更改List ,這會在應用程序開始增長時帶來問題。 它變得難以維護。

因此,您應該做的是在類中公開“事件”樣式的接口,即

public final void addItemsToListView(final List<String> pItems) {
  // update the internal list
  // refresh the list
}

由於此“隱藏”或封裝List的實際內容,因此您會發現您的應用程序將變得更加容易,因為圍繞該應用程序的許多分布式邏輯並不依賴於知道List的內容是什么。 。 您只是強制實施協議 ,局外人只能加入 List

強制執行此類約定后,應用程序將變得更加容易/安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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