gpt4 book ai didi

Android Firebase 数据在刷新之前不会加载

转载 作者:行者123 更新时间:2023-11-29 19:15:42 27 4
gpt4 key购买 nike

我正在 Android Studio 中开发一个应用程序,并使用 Firebase 来存储/检索数据。这工作正常,但是当我将检索到的数据保存到局部变量,然后尝试在 ListView 中显示数据时,它不起作用,直到我刷新 View 。

这是我的 OnCreate 函数:

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_chores);

//get database reference and user data
mDatabase = FirebaseDatabase.getInstance().getReferenceFromUrl("https://...");
user = (User) getIntent().getSerializableExtra("user");

configureBackButton();
updateFromFirebase();
display();
}

这是更新函数(变量映射是一个全局变量):

private void updateFromFirebase() {
final ArrayList<String> list;
final String name = user.getName().toLowerCase();

mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
for(DataSnapshot child : snapshot.getChildren()) {
ArrayList<String> list;
String name;
name = child.getKey();
list = (ArrayList)child.getValue();
map.put(name.toLowerCase(), list);
}
}

@Override
public void onCancelled(DatabaseError databaseError) {
...
}
});
list = map.get(name);
if(list==null) return;

final ListView list_xml = (ListView) findViewById(R.id.list);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
list_xml.setAdapter(adapter);
}

这是显示函数:

private void display() {
final ArrayList<String> list;
final String name = user.getName().toLowerCase();

list = map.get(name);
if(list==null) return;

final ListView list_xml = (ListView) findViewById(R.id.list);
final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
list_xml.setAdapter(adapter);

list_xml.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String item = adapter.getItem(position);
list.remove(item);
map.put(name, list);

CoordinatorLayout coordinatorLayout = (CoordinatorLayout) findViewById(R.id.coordinatorLayout);

Snackbar sb = Snackbar.make(coordinatorLayout, "Item Removed!", Snackbar.LENGTH_SHORT);
sb.show();

adapter.notifyDataSetChanged();
}
});

}

如有任何关于为什么第一次不显示的见解,我们将不胜感激。

最佳答案

由于valueEventListener是一个异步函数,它可能不会立即得到结果,所以我认为如果你更新UI,当数据改变时(onDataChange)会更好

    @Override
public void onDataChange(DataSnapshot snapshot) {
for(DataSnapshot child : snapshot.getChildren()) {
ArrayList<String> list;
String name;
name = child.getKey();
list = (ArrayList)child.getValue();
map.put(name.toLowerCase(), list);
}
//this is displaying result whenever change occurs
display();
}

关于Android Firebase 数据在刷新之前不会加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com