在Firestore功能后设置适配器或RecyclerView刷新

时间:2018-09-10 12:51:52

标签: android firebase android-recyclerview realm google-cloud-firestore

我正在使用Cloud Firestore集合中的信息填充realm数据库表。在第一次加载时,该应用程序将打开并保存信息,但是直到我关闭并打开该应用程序后,该信息才会显示。

在将信息写入领域数据库之后,我需要显示这些信息。即无需关闭和打开应用程序。我试图通过将它们放入方法中并按顺序放在onCreate方法中来做到这一点。

因此,在将所有信息都写入领域数据库之后,我希望填充recyclerview,但是我不知道该怎么做,请帮忙?

ScreenShots

第一次发射(左)和第二次发射(右)

Screen1 Screen2

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);
}

1 个答案:

答案 0 :(得分:3)

由于onComplete()方法具有异步行为,因此无法按照您的方式尝试在回调之外检索数据。因此,您不能简单地使用以下代码行:

Assessment=helper.retrieve();

并希望像这样检索和使用数据。 Firebase API是asynchronous,这意味着onComplete()方法在调用后立即返回,并且它返回的Task的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此您尚未尝试在Assessment方法外部使用的onComplete()对象的值已经从回调中填充了。

基本上,您正在尝试从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。

此问题的快速解决方案是仅在a方法内使用从数据库中获取的onComplete()对象,否则,我建议您从此<中查看我的答案的最后一部分< strong> post ,在其中我解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。