想在我目前面临的怪异问题上获得您的帮助。我试了几天,但没有运气,最后决定在这里发帖寻求帮助。
我创建了一个快照侦听器,该快照侦听器附加到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中的数据,具体取决于我评论的代码。
请告知我在哪里犯错。在此先感谢
老实说,我不确定我的回答不会把你引向错误的方向,但是你可以尝试。
我的猜测是,您的问题可能与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)