Firebase recycleAdapter дублирует объекты в arrayList - PullRequest
0 голосов
/ 16 декабря 2018

Когда я запускаю это действие, он записывает видимые объекты списка в массив, но когда я прокручиваю вниз и возвращаюсь вверх, он снова дублирует элементы в массив.Как это исправить?Чтобы элемент был добавлен только один раз.

Я пытался установить , но получил ту же проблему.

private void displayMessages(){

    final Set<ChatMessage> mSet= new HashSet<ChatMessage>();
    mChat = new ArrayList<>();

    mDBRootRef.child("messages").child(messageSenderId).child(messageReceiverId)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    for (DataSnapshot snapshot : dataSnapshot.getChildren() ) {
                        ChatMessage chat = snapshot.getValue(ChatMessage.class);

                        mSet.add(chat);

                    }

                    mChat.clear();
                    mChat.addAll(mSet);

                    MessageAdapter messageAdapter = new MessageAdapter(ChatActivity.this, mChat);
                    mUserMessagesListRV.setAdapter(messageAdapter);



                }

Я также пытался .addChildEventListener вместо. addValueEventListener , но возникает та же проблема.

Вот инициализация recycyleview.

    mUserMessagesListRV = (RecyclerView) findViewById(R.id.recyclerview_chat_log);
    mUserMessagesListRV.setHasFixedSize(true);
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
    linearLayoutManager.setStackFromEnd(true);
    mUserMessagesListRV.setLayoutManager(linearLayoutManager);

Вот метод onBindViewHolder.

@Override
public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder viewHolder, int position) {

    //mChat is a list declared as private List<ChatMessage> mChat;
    ChatMessage chat = mChat.get(position);
    viewHolder.showMessage.setText(chat.getMessageText());
}

1 Ответ

0 голосов
/ 16 декабря 2018

Кстати, странно, что вы не получили исключение одновременной модификации.Вы не можете удалить из списка, повторяя его:

 mChat = new HashSet<>();

  ....

   for (DataSnapshot ds : dataSnapshot.getChildren()) {
            for (DataSnapshot data : ds.getChildren()) { 

               ChatMessage chat = snapshot.getValue(ChatMessage.class);
                mChat.add(chat);
            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...