android - 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");
}
}
}
}
});
});
解决方案
推荐阅读
- python - 如何找到要在项目中使用的标头?
- php - 为什么 get_call_class() 从不同对象进行静态调用后报告错误结果?
- ios - xcrun 中缺少 iphone sdk 如何从命令行为 iphone 构建?
- sql - 旋转两列
- javascript - document.querySelectorAll :not with multiple :not(s)
- graph-theory - 解决 3 组而不是 2 组的分配问题
- angular - 如何将信息从一个组件传递到Angular 2+中的嵌套子组件?
- r - 在 R 中创建函数以应用于多个数据集
- docker - 不确定如何编排 docker 容器
- eloquent - 使用与其他几个模型的多对多关系的单个模型