当我运行此活动时,它将可见的列表对象记录到数组中,但是当我向下滚动并返回时,它将元素再次复制到数组中。如何解决?对于一次只能添加一次的项目。
我已尝试设置,但遇到了同样的问题。
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());
}
答案 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循环
之前清除ArraylistPublic void onDataChange(@NonNull DataSnapshot dataSnapshot){
YourArrayList.clear();
for(DataSnapshot ........