首页 > 解决方案 > Firestore 更改导致多次射击

问题描述

我有一个由 firestore + 改造加载的列表。它显示了未隐藏和隐藏的聊天。每当我按下回收站视图上的按钮以隐藏或显示时,回收站视图都会加载多个已删除的项目。请帮助我正确设置此隐藏/显示功能,以便在回收站视图中多次加载的错误消失。设置在带有 viewpager 的片段中。它可能看起来像很多代码,但需要得到答案。另一种方法是有两个单独的列表(一个隐藏的,一个显示的),但我想看看是否可以这样做。

片段负载(工作正常)

getChatListFromFireBase("0");

// Populate The Visible Chat List On Button Click
    ivShow.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        getChatListFromFireBase("0");
    }
});

// Populate The Hidden Chat List On Button Click
    ivHide.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        getChatListFromFireBase("1");
    }
});

在片段中显示列表的功能

// Get Chats List From FireStore
private void getChatListFromFireBase(String hiddenStatus) {

    lIndividualChatList.clear();
    lIndividualChatListIds.clear();

    fbFs.collection("individual_chats").document(mySqlUserId).collection("lists").whereEqualTo("hide_status", hiddenStatus).addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {

            if (e != null) {

            }

            for (DocumentChange dc : documentSnapshots.getDocumentChanges()) {
                switch (dc.getType()) {
                    case ADDED:
                        key = dc.getDocument().getId();
                        firebaseRetrofitQuery(dc, "Added", key);
                        break;

                    case MODIFIED:
                        key = dc.getDocument().getId();
                        // Do The Change Function
                        firebaseRetrofitQuery(dc, "Changed", key);
                        break;

                    case REMOVED:
                        break;
                }
            }
        }
    });
}

片段中的支持函数

// Retrofit Query
private void firebaseRetrofitQuery(DocumentChange documentChange, final String childActivityType, final String key) {

    if (childActivityType.equals("Added")) {
        lIndividualChatListIds.add(key);
    }

    // Get The Receiver Id To Get Data From Other Nodes
    final String mySqlFriendUserId = documentChange.getDocument().getId();
    final String hideStatus = (String) documentChange.getDocument().getData().get("hide_status");

    // Use Retrofit Call
    Call<JsonObject> call = RetrofitClient.getInstance().profilesGetApi().getIndividualDetails(mySqlUserId, mySqlFriendUserId);

    call.enqueue(new Callback<JsonObject>() {
        @Override
        public void onResponse(@NonNull Call<JsonObject> call, @NonNull Response<JsonObject> response) {

            JSONObject jsonObject;
            try {
                jsonObject = new JSONObject(new Gson().toJson(response.body()));

                // Check If User Array Has Anything
                JSONArray userArray = jsonObject.getJSONArray("user_array");

                // Get The Json Object
                JSONObject returnJSONObject = userArray.getJSONObject(0);
                String name = returnJSONObject.optString("name");


                if (childActivityType.equals("Added")) {

                    // Populate The Array List With Data From Both Nodes
                    lIndividualChatList.add(new IndividualListModel(name, hideStatus));
                }

                if (childActivityType.equals("Changed")) {

                    int index = lIndividualChatListIds.indexOf(key);
                    lIndividualChatList.set(index, new IndividualListModel(name, hideStatus));
                }

                // Use The Adapter To Populate The Recycler View
                aIndividualChatList = new IndividualListAdapter(getContext(), lIndividualChatList, senderActivity, new IndividualListAdapter.OnItemClickListener() {

                    @Override
                    public void onItemClicked(final Map data) {

                    }
                });

                rvList.setAdapter(aIndividualChatList);
                aIndividualChatList.notifyDataSetChanged();

            } catch (JSONException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onFailure(@NonNull Call<JsonObject> call, @NonNull Throwable t) {

        }
    });

}

在回收站视图适配器中

viewHolder.ivHide.setOnClickListener(new View.OnClickListener()
{
    @Override public void onClick (View v){

    fbFs.collection("individual_chats").document(mySqlUserId).collection("lists").document(individualListModel.getMysql_friend_user_id()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {

            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {

                    String hiddenStatus = document.getString("hide_status");

                    if (hiddenStatus.equals("0")) {

                        fbFs.collection("individual_chats").document(mySqlUserId).collection("lists").document(individualListModel.getMysql_friend_user_id()).update("hide_status", "1");

                    }

                    if (hiddenStatus.equals("1")) {

                        fbFs.collection("individual_chats").document(mySqlUserId).collection("lists").document(individualListModel.getMysql_friend_user_id()).update("hide_status", "0");
                    }
                }
            }
        }
    });
});

标签: androidgoogle-cloud-firestoreretrofit

解决方案


推荐阅读