Пожарная перемена ведет к нескольким выстрелам - PullRequest
0 голосов
/ 16 марта 2020

У меня есть список, который загружается 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");
    }
});

Функция для отображения списка в Fragement

// 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) {

        }
    });

}

В адаптере вида Recycler

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