Я пытаюсь удалить элементы из RecyclerView, я использую ChildEventListener вместе с запросом limitToLast. Очевидно, что при добавлении элемента onChildRemoved запускается до onChildAdded , чтобы сначала удалить элемент с index 0 , аналогично, когда я удаляю элемент onChildAdded запускается после onChildRemoved , который добавляет старый элемент (более старый, чем элемент с индексом 0) обратно в список, в результате чего этот старый элемент появляется внизу списка. Есть ли способ, с помощью которого я могу избежать этого и добавить старый элемент обратно в index 0 .
Я попытался использовать флаг, который я установил в своем методе удаления, чтобы определить, что какой-то элементудаляется мной, и старый элемент должен быть добавлен индекс 0 вместо индекса n. Это, конечно, бесполезно, поскольку это не синхронизирует поведение на других устройствах, кроме моего, потому что значение их флага не будет обновлено.
Вот мой ChildEventListener
Query lastQuery = databaseReference.child("Private Chats").child(chatkey).orderByKey().limitToLast(120);
lastQuery.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ChatMessage value = dataSnapshot.getValue(ChatMessage.class);
ChatMessage fire = new ChatMessage();
String msgtxt = value.getMessageText();
String user = value.getMessageUser();
long msgtime = value.getMessageTime();
String prothumb = value.getProfuri();
String type = value.getType();
String sentimguri = value.getSentimguri();
Boolean seen = value.getSeen();
fire.setMessageUser(user);
fire.setMessageText(msgtxt);
fire.setMessageTime(msgtime);
fire.setProfuri(prothumb);
fire.setType(type);
fire.setSentimguri(sentimguri);
fire.setSeen(seen);
//**PROBLEM** The flag I set in my delete method to identify if the item should be added at
//bottom or top does not work for others as they don't have the flag value updated
if (flag != 2) {
keys.add(dataSnapshot.getKey());
list.add(fire);
}
//sync deletion
String key=dataSnapshot.getKey();
int index=keys.indexOf(key);
if(flag==2)
{
list.add(0,fire);
keys.add(0,key);
}
Log.d("Added ","By "+Integer.toString(index));
mAdapter.notifyItemInserted(index);
if (!(mRecyclerView.canScrollVertically(1))) {
mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount());
newmessages.clearAnimation();
newmessages.setVisibility(View.GONE);
} else {
if (flag == 0) {
newmessages.setVisibility(View.VISIBLE);
newmessages.startAnimation(AnimationUtils.loadAnimation(PrivateMessage.this, R.anim.bounceanim));
}
}
setFlag(0);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
//Updates the message seen/delivered field.
ChatMessage value = dataSnapshot.getValue(ChatMessage.class);
String key = dataSnapshot.getKey();
int index = keys.indexOf(key);
ChatMessage fire = new ChatMessage();
String msgtxt = value.getMessageText();
String user = value.getMessageUser();
long msgtime = value.getMessageTime();
String prothumb = value.getProfuri();
String type = value.getType();
String sentimguri = value.getSentimguri();
Boolean seen = value.getSeen();
fire.setMessageUser(user);
fire.setMessageText(msgtxt);
fire.setMessageTime(msgtime);
fire.setProfuri(prothumb);
fire.setType(type);
fire.setSentimguri(sentimguri);
fire.setSeen(seen);
Log.d("Changed at ", index + fire.getSeen().toString());
list.set(index, fire);
mAdapter.notifyItemChanged(index);
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
String key = dataSnapshot.getKey();
int index = keys.indexOf(key);
keys.remove(key);
list.remove(index);
Log.d("Deletion", "at " + Integer.toString(index));
mAdapter.notifyItemRemoved(index);
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Вот мой метод удаления
void deleteMessage(int position) {
String key = keys.get(position);
chatkey = ((PrivateMessage) mContext).getChatkey();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Private Chats").child(chatkey);
ref.child(key).removeValue();
((PrivateMessage)mContext).setFlag(2);
Toast.makeText(mContext, "Deleted", Toast.LENGTH_SHORT).show();
}
Если у кого-то есть идея или другой подход о том, как добавить элемент вверху, а не внизу списка, чтобы он синхронизировался наУстройство получателя тоже, пожалуйста, помогите мне, я почесал голову над этим в течение нескольких дней.
PS Я использовал ValueEventListener и раньше, но он слишком сильно сбрасывает взгляд на реселлер, после чего в течение секунды после удаления просвечивались случайные положения.