我正在使用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);
}
答案 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
中。
在执行此类约定后,应用程序将变得更加轻松/安全。