Как удалить из RecyclerView при использовании ChildEventListener вместе с запросом limitToLast - PullRequest
2 голосов
/ 02 ноября 2019

Я пытаюсь удалить элементы из 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 и раньше, но он слишком сильно сбрасывает взгляд на реселлер, после чего в течение секунды после удаления просвечивались случайные положения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...