Firebase recycleAdapter复制arrayList中的对象

时间:2018-12-16 17:28:19

标签: android firebase firebase-realtime-database android-recyclerview

当我运行此活动时,它将可见的列表对象记录到数组中,但是当我向下滚动并返回时,它将元素再次复制到数组中。如何解决?对于一次只能添加一次的项目。

我已尝试设置,但遇到了同样的问题。

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());
}

3 个答案:

答案 0 :(得分:0)

奇怪的是,您没有获得并发修改异常。迭代时无法将其从列表中删除:

 mChat = new HashSet<>();

  ....

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

               ChatMessage chat = snapshot.getValue(ChatMessage.class);
                mChat.add(chat);
            }
    }

答案 1 :(得分:0)

参加聚会真的很晚,但是我遇到了同样的问题,事实证明,即使我退出了Activity,侦听器也始终与数据库引用保持联系。因此,当我重新进入时,它实际上将包含2个侦听器,它们执行相同的操作,从而复制了RecyclerView成员。 附加侦听器时,尝试添加一个额外的getApplicationContext()参数。

 mDBRootRef.child("messages").child(messageSenderId).child(messageReceiverId)
        .addValueEventListener(getApplicationContext(), new ValueEventListener() {
           // Do stuff
         }

这样,当您finish()执行活动时,与该活动相关的侦听器将从数据库引用中分离出来。

答案 2 :(得分:-1)

尝试一下 只需在for循环

之前清除Arraylist
Public void onDataChange(@NonNull DataSnapshot dataSnapshot){
    YourArrayList.clear();
    for(DataSnapshot ........