我正在用来自cloud firestore集合的信息填充数据库表。第一次加载时,应用程序将打开并保存信息,但在我关闭并打开应用程序之前不会显示该信息。
我需要这些信息在写入领域数据库后显示出来。不用关闭和打开应用程序。我试着把它们放在方法中,并在oncreate方法中按顺序排列。
因此,在它将所有信息写入realm数据库之后,我希望recyclerview能够填充,但我不知道如何填充,请帮助?
截图
第一次发射(左)和第二次发射(右)
android - 在Firestore功能后设置适配器或RecyclerView刷新-LMLPHPandroid - 在Firestore功能后设置适配器或RecyclerView刷新-LMLPHP
创建时:

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/

10-12 02:32