【发布时间】:2020-05-15 05:31:52
【问题描述】:
当我运行这个活动时,它会将可见列表对象记录到一个数组中,但是当我向下滚动并返回时,它会将元素再次复制到数组中。如何解决?一个项目只能添加一次。
我尝试了 set,但遇到了同样的问题。
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,但遇到了同样的问题。
这里是 recyleview 初始化。
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());
}
【问题讨论】:
-
你有没有尝试评论
mChat.addAll(mSet);?这种情况下的行为是什么? -
因为我们在 mChat.addAll 之前清除列表,然后将集合添加到列表中。
-
你试过我问你的吗?
-
是的,还是不行
-
This 是一种推荐的方式,您可以通过这种方式从 Firebase 实时数据库中检索数据并使用
FirebaseRecyclerAdapter将其显示在RecyclerView中。
标签: android firebase firebase-realtime-database android-recyclerview