如何显示来自同一快照侦听器(Firebase)的Fragment和Activity中的数据(均独立)

问题描述 投票:0回答:1

想在我目前面临的怪异问题上获得您的帮助。我试了几天,但没有运气,最后决定在这里发帖寻求帮助。

我创建了一个快照侦听器,该快照侦听器附加到Firebase中的集合,定义如下:-

public class FirebaseTypingStatusLiveData extends LiveData<List<documentSnapshot>> {
// Logging constant
    private static final String TAG = "FirebaseQueryLiveData";
// Document Reference
    private final DocumentReference documentReference;
 // Listener
    private final MyDocumentListener listener = new MyDocumentListener();
    // Handler
    private final Handler handler = new Handler();
    private ListenerRegistration listenerRegistration;
    // Flag to remove listener
    private boolean listenerRemovePending = false;

    private MutableLiveData <List<documentSnapshot> mutableLiveData = new MutableLiveData<>();

 // Constructor
    public FirebaseTypingStatusLiveData(DocumentReference documentReference) {
    this.documentReference = documentReference;
    }

    public LiveData<List<documentSnapshot>> checknow(){

      // Add listener
        if (!Listeners.LIVESAMPLE.containsKey(documentReference)) {
            listenerRegistration = documentReference.addSnapshotListener(listener);
            Listeners.LIVESAMPLE.put(documentReference, listenerRegistration);

        } else {
        listenerRegistration = Listeners.LIVETYPINGSTATUSSAMPLE.get(documentReference);
        }
    return mutableLiveData;
    }

    // Listener definition
    private class MyDocumentListener implements EventListener<DocumentSnapshot> {
        @Override
        public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable 
        FirebaseFirestoreException e) {

        Log.d(TAG, "onEvent");
            // Check for error
            if (e != null) {

            // Log
            Log.d(TAG, "Can't listen to query snapshots: " + documentSnapshot
                    + ":::" + e.getMessage());
            return;
            }
            setValue(documentSnapshot);
            mutableLiveData.setValue(documentSnapshot);

               }

          }
        }
     }

快照可以完美地读取数据,并在数据可用时提供建议。

正在显示快照数据1.在片段中(不是我正在谈论的Activity的一部分)2.通过具有相同代码的两个视图模型进行的Activity如下:

    @NonNull
    public LiveData<List<documentSnapshot>> getDataSnapshotLiveData() {
        Firestore_dB db = new Firestore_dB();
        DocumentReference docref = db.get_document_firestore("Sample/"+docID);
        FirebaseTypingStatusLiveData firebaseTypingStatusLiveData = new 
        FirebaseTypingStatusLiveData(docref);
        return firebaseTypingStatusLiveData.checknow();
    }

片段和活动代码也相同,除了更改所有者如下:-

LiveData<List<documentSnapshot>> liveData = viewmodel.getDataSnapshotLiveData();
     liveData.observe(this, new Observer<List<documentSnapshot>>() {
            @Override
            public void onChanged(DocumentReference docreef) {
            String name = docreef.get("name");
                        stringname.setText(name); // The text is displaying either in Fragment or in Activity but not in both.
      });

我的问题是我同时需要Fragment和Activity中的数据,而我要获取Fragment或Activity中的数据,具体取决于我评论的代码。

请告知我在哪里犯错。在此先感谢

android firebase android-fragments firebase-storage android-livedata
1个回答
0
投票

老实说,我不确定我的回答不会把你引向错误的方向,但是你可以尝试。

我的猜测是,您的问题可能与ViewModel共享有关。有一个众所周知的任务How to share Viewmodel between fragments。但是对于您而言,这无济于事,因为您必须在活动之间共享ViewModel(现在您有两个单独的ViewModel,这可能是Firestore EventListeners的问题)。

技术上,您可以在活动之间共享ViewModel(因为我通常使用Single活动模式,所以我没有尝试过)。为此,可以将其作为ViewModelProvider constructor中的owner参数来设置自定义Application类的实例(但是您可以为其实现接口ViewModelStoreOwner)。之后,在您的活动和片段中,您都可以使用Application类实例获得相同的ViewModel:

val sharedViewModel = ViewModelProvider(mainApplication, viewModelFactory).get(SharedViewModel::class.java)
© www.soinside.com 2019 - 2024. All rights reserved.