我正在用来自cloud firestore集合的信息填充数据库表。第一次加载时,应用程序将打开并保存信息,但在我关闭并打开应用程序之前不会显示该信息。
我需要这些信息在写入领域数据库后显示出来。不用关闭和打开应用程序。我试着把它们放在方法中,并在oncreate方法中按顺序排列。
因此,在它将所有信息写入realm数据库之后,我希望recyclerview能够填充,但我不知道如何填充,请帮助?
截图
第一次发射(左)和第二次发射(右)
创建时:
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);
}
最佳答案
由于onComplete()
方法具有异步行为,因此尝试以这种方式在回调之外检索数据将不起作用。因此,不能简单地使用以下代码行:
Assessment=helper.retrieve();
希望能像这样检索和使用数据。firebaseapi是
asynchronous
,这意味着onComplete()
方法在被调用后立即返回,并且它返回的Task
回调将在稍后被调用。不能保证要花多长时间。因此,在数据可用之前,可能需要几百毫秒到几秒的时间。因为该方法会立即返回,所以您试图在Assessment
方法之外使用它的onComplete()
对象的值尚未从回调中填充。基本上,您试图从异步的api同步返回一个值。那不是个好主意。您应该按照预期异步处理这些api。
这个问题的一个快速解决方案是使用
a
对象,这个对象只在onComplete()
方法中从数据库中获取,否则我建议您查看我的anwser的最后一部分,在这个post中,我已经解释了如何使用自定义回调来完成它。您还可以查看这个video以获得更好的理解。关于android - 在Firestore功能后设置适配器或RecyclerView刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52258241/