OnItemSelected当Spinner从Firebase获取阵列列表时,不会调用
问题描述:
该应用通过OnDataChange
从Firebase获取阵列列表并且有OnItemSelected
,但不幸的是它不会调用。 (实际上微调者是从Firebase数据库中获取字符串的。) 我已经使用本地数组列表和OnItemSelected
作品测试了代码。 为什么?OnItemSelected当Spinner从Firebase获取阵列列表时,不会调用
这些都是我的功能:
public void initSpinner() {
restartAudioSpinner();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(AddAudioItems.this, android.R.layout.simple_spinner_dropdown_item, categoriesTitle);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
public void restartAudioSpinner() {
DatabaseReference database;
database = FirebaseDatabase.getInstance().getReference("Audio Categories");
database.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
categorylist = new ArrayList<String>();
for (DataSnapshot data :dataSnapshot.getChildren()) {
CategoryNew category = data.getValue(CategoryNew.class);
categoriesList.add(new CategoryNew(category.getImageUrl(),category.getTitle()));
}
for (int i = 0; i < categoriesList.size(); i++) {
categoriesTitle.add(categoriesList.get(i).getTitle());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(AddAudioItems.this, categoriesTitle.get(i), Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> adapterView) {
Toast.makeText(AddAudioItems.this, "לא נבחרה שום רשומה, אנא בחר קטגוריה", Toast.LENGTH_SHORT).show();
}
答
最后,我已经找到了答案我自己。 Firebase功能以同步方式工作。我还没有找到改变这种方式的方法 - 以某种方式操纵它。 处理从Firebase函数接收的数据的答案是在for(从数据库收集信息)INSIDE onDataChange后,初始化所需的函数。 例如:
public void restartAudioSpinner() {
DatabaseReference database;
database = FirebaseDatabase.getInstance().getReference("Audio Categories");
database.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
categorylist = new ArrayList<String>();
for (DataSnapshot data :dataSnapshot.getChildren()) {
CategoryNew category = data.getValue(CategoryNew.class);
categoriesList.add(new CategoryNew(category.getImageUrl(),category.getTitle()));
}
for (int i = 0; i < categoriesList.size(); i++) {
categoriesTitle.add(categoriesList.get(i).getTitle());
}
**// PUT THE DESIRED FUNCTION HERE!!!** EX: INIT THE SPINNER
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
微调器是否填充了数据列表?你不应该'Thread.sleep(4000);'如果这就是主要的。 –
是的,你可以在这里看到完整的代码:https://pastebin.com/hSH0dfuB – WhiteNinja
你正在做'Thead.sleep(4000);'在主线程上,你应该等待回调中的数据被加载。 –