Как отображать данные во фрагменте и активности (независимо) из одного и того же прослушивателя снимков (Firebase) - PullRequest
0 голосов
/ 08 мая 2020

Хотел бы получить вашу помощь в моей странной проблеме, с которой я сейчас столкнулся. Я пытался пару дней, но безуспешно, и, наконец, решил написать здесь, чтобы получить помощь.

Я создал Snapshot Listener, прикрепленный к коллекции в 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. Активность через две модели представления, которые имеют такой же код, как показано ниже:

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

Моя проблема в том, что мне нужны данные в обоих т.е. фрагмент и активность, в то время как я получаю данные либо во фрагменте, либо в действии, в зависимости от кода, который я прокомментировал.

Пожалуйста, сообщите, где я делаю ошибку. Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 16 мая 2020

Я сделал LiveData stati c, которая отслеживает изменения в исходных данных и предоставляет обновленный контент, когда-либо требовавшийся в различных действиях.

0 голосов
/ 09 мая 2020

Честно говоря, я не уверен, что мой ответ не уведет вас на ложный путь, но вы можете попробовать.

Я предполагаю, что ваша проблема могла быть каким-то образом связана с совместным использованием ViewModel. Есть известная задача Как разделить Viewmodel между фрагментами . Но в вашем случае это не может помочь, потому что вам нужно совместно использовать ViewModel между действиями (теперь у вас есть две отдельные ViewModel, и это может быть проблемой с Firestore EventListeners).

Технически вы можете совместно использовать ViewModel между действиями ( Я не пробовал, так как обычно использую шаблон Single activity). Для этого в качестве параметра owner в конструкторе ViewModelProvider вы можете установить экземпляр своего пользовательского класса Application (но для него у вас есть интерфейс ViewModelStoreOwner ). После этого и в вашей деятельности, и в вашем фрагменте вы можете получить одну и ту же ViewModel с экземпляром класса Application:

val sharedViewModel = ViewModelProvider(mainApplication, viewModelFactory).get(SharedViewModel::class.java)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...