我正在使用Cloud Firestore集合中的信息填充realm
数据库表。在第一次加载时,该应用程序将打开并保存信息,但是直到我关闭并打开该应用程序后,该信息才会显示。
在将信息写入领域数据库之后,我需要显示这些信息。即无需关闭和打开应用程序。我试图通过将它们放入方法中并按顺序放在onCreate方法中来做到这一点。
因此,在将所有信息都写入领域数据库之后,我希望填充recyclerview,但是我不知道该怎么做,请帮忙?
ScreenShots
第一次发射(左)和第二次发射(右)
OnCreate:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_import_user);
RelativeLayout = findViewById(R.id.contentuserimport);
// initialize realm
Realm.init(getApplicationContext());
//SETUP REEALM
RealmConfiguration defaultConfig = new RealmConfiguration.Builder()
.schemaVersion(0)
.build();
realm=Realm.getInstance(defaultConfig);
Intent intent = getIntent();
moduleID = intent.getStringExtra("moduleID");
moduleName = intent.getStringExtra("moduleName");
ButterKnife.bind(this);
init();
getAssessList();
}
Init():
private void init(){
linearLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
friendList.setLayoutManager(linearLayoutManager);
db = FirebaseFirestore.getInstance();
textView1.setText("Assessments - "+moduleName);
db.collection("assessment").whereEqualTo("module","xbIpNiDXGsIPmb5sTwbH").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
//GET DATA
Assessment a=new Assessment(Double.parseDouble(document.get("achieved").toString()),
document.get("date").toString(),document.get("desc").toString(),document.get("module").toString(),
document.get("time").toString(),Double.parseDouble(document.get("total").toString()),document.get("type").toString(),
document.get("weight").toString());
//SAVE
RealmHelper helper=new RealmHelper(realm);
helper.save(a);
}
}
}
});
//READ
RealmHelper helper=new RealmHelper(realm);
Assessment=helper.retrieve();
//BIND
adapter=new AssessAdapter(this,Assessment);
friendList.setAdapter(adapter);
adapter.notifyDataSetChanged();
friendList.setAdapter(adapter);
}
getAssessList():
private void getAssessList(){
//RETRIEVE
RealmHelper helper=new RealmHelper(realm);
Assessment=helper.retrieve();
//BIND
adapter=new AssessAdapter(this,Assessment);
friendList.setAdapter(adapter);
adapter.notifyDataSetChanged();
friendList.setAdapter(adapter);
}
答案 0 :(得分:3)
由于onComplete()
方法具有异步行为,因此无法按照您的方式尝试在回调之外检索数据。因此,您不能简单地使用以下代码行:
Assessment=helper.retrieve();
并希望像这样检索和使用数据。 Firebase API是asynchronous
,这意味着onComplete()
方法在调用后立即返回,并且它返回的Task
的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试在Assessment
方法外部使用的onComplete()
对象的值已经从回调中填充了。
基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。
此问题的快速解决方案是仅在a
方法内使用从数据库中获取的onComplete()
对象,否则,我建议您从此<中查看我的答案的最后一部分< strong> post ,在其中我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。