Firebase firestore document changes

2020-07-26 14:26发布

问题:

I just want to ask how can I properly use the document changes in my app? Btw there are 3 types of that which is ADDED, MODIFIED and lastly REMOVED. TYPE.ADDED works perfectly fine, but in modified and removed it doesn't work well in modified it. I am using a recyclerview for that and here's my code. Am I wrong utilizing it? Also, I am using a instance oldindex and newindex to know the index which is affected by the action performed.

for (DocumentChange doc : documentSnapshots.getDocumentChanges()) {
    if(doc.getType() == DocumentChange.Type.ADDED) {
        PostsClass post = doc.getDocument().toObject(PostsClass.class).withId(doc.getDocument().getId());
        postList.add(post);
        Log.d(TAG, post.toString());
        postsAdapter.notifyDataSetChanged();
    }
    else if (doc.getType() == DocumentChange.Type.MODIFIED) {
        adoptList.clear();
        AdoptClass adopt = doc.getDocument().toObject(AdoptClass.class).withId(doc.getDocument().getId());
        adoptList.add(adopt);
        adoptListAdapter.notifyItemChanged(oldIndex);
    }
    else  if (doc.getType() == DocumentChange.Type.REMOVED) {
        adoptList.remove(oldIndex);
        adoptListAdapter.notifyItemRemoved(oldIndex);
    }
}

回答1:

below code worked for me in 3 conditions ADDED,MODIFIED,REMOVED (Android Firestore)

 for (DocumentChange documentChange : queryDocumentSnapshots.getDocumentChanges()) {
                    if (documentChange.getType() == DocumentChange.Type.ADDED) {

                        String doc_id = documentChange.getDocument().getId();
                        PostModel postModel = documentChange.getDocument().toObject(PostModel.class).withDocId(doc_id);
                        postModelList.add(postModel);

                    } else if (documentChange.getType() == DocumentChange.Type.MODIFIED) {

                         // modifying

                        String docID = documentChange.getDocument().getId();
                        PostModel changedModel = documentChange.getDocument().toObject(PostModel.class).withDocId(docID);
                        if (documentChange.getOldIndex() == documentChange.getNewIndex()) {
                            // Item changed but remained in same position
                            postModelList.set(documentChange.getOldIndex(),changedModel);
                            postListAdapter.notifyItemChanged(documentChange.getOldIndex());
                        }else {
                            // Item changed and changed position
                            postModelList.remove(documentChange.getOldIndex());
                            postModelList.add(documentChange.getNewIndex(),changedModel);
                            postListAdapter.notifyItemMoved(documentChange.getOldIndex(),documentChange.getNewIndex());
                        }

                        postListAdapter.notifyDataSetChanged();
                    } else if (documentChange.getType() == DocumentChange.Type.REMOVED) {

                        // remove
                        postModelList.remove(documentChange.getOldIndex());
                        postListAdapter.notifyItemRemoved(documentChange.getOldIndex());
                    }


                }