如何从Firebase更新ListView

时间:2019-02-10 15:14:19

标签: java android 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);

}

1 个答案:

答案 0 :(得分:0)

因此,如果它们在单独的类中,则需要某种方式来公开以更新ListView。例如,在一个类中,您可以使用“获取器”来使ListView及其数据源对外界可见,即

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

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

这将允许您将append个项目添加到mListViewDataSource,完成后,请在notifyDatasetChanged()的{​​{1}}上调用ListView强制Android识别列表的内容已更改。

但是,这不是理想。这是因为在应用程序中的任何地方,您都可以访问Adapter的内容并任意更改,这会在应用程序开始增长时带来问题。它变得难以维护。

因此,您应该做的是在您的类中公开“事件”样式的界面,即

List

由于public final void addItemsToListView(final List<String> pItems) { // update the internal list // refresh the list } 的实际内容是“隐藏”或封装,因此您会发现您的应用程序将变得更加容易,因为围绕应用程序不依赖于知道List的内容是什么。您只是在强制协议,外人只能将添加到List中。

在执行此类约定后,应用程序将变得更加轻松/安全。