我创建了一个使用 firebase 显示聊天消息的 Activity 。当我们第一次打开 Activity 时,它工作正常并显示一次来自数据库的消息并且看起来不错,但是一旦我们发送新消息或尝试 Intent 新活动以及一旦我们返回到显示消息的同一 Activity 。在该 Activity 中,聊天数据显示了三次,我们再次发送消息,它显示了四次消息...因为我是 Android 领域的新手,我已经尝试了所有的想法,但没有一个有效。
下面是包含回收器 View 的个人聊天 Activity 的 onstart 方法的代码,当它启动时,我连接到消息采用者,然后消息采用者使用检索数据的消息类执行将值传递到回收 View 的过程从数据库中。
个人聊天.java
protected void onStart() {
super.onStart();
rootRef.child("Message").child(CurrentUserId).child(msgReciverId).addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
message cMessage = dataSnapshot.getValue(message.class);
messageList.add(cMessage);
messageAdapter.notifyDataSetChanged();
usermsglist.smoothScrollToPosition(usermsglist.getAdapter().getItemCount());
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
Message_adapter.java
public class message_adapter extends RecyclerView.Adapter<message_adapter.MessageViewHolder> {
private List<message> usermsgList;
private FirebaseAuth mAuth;
private DatabaseReference userref;
public message_adapter(List<message> usermsgList){
this.usermsgList = usermsgList;
}
@NonNull
@Override
public MessageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.coustommsglayout,parent,false);
mAuth = FirebaseAuth.getInstance();
return new MessageViewHolder(view);
}
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onBindViewHolder(@NonNull final MessageViewHolder holder, final int position) {
String msgsenderid = mAuth.getCurrentUser().getUid();
final message Message = usermsgList.get(position);
String fromuserid = Message.getFfrom();
String touserid = Message.getTo();
final String fromMessageType = Message.getType();
userref = FirebaseDatabase.getInstance().getReference().child("User").child(fromuserid);
userref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("image")){
String reciverimage = dataSnapshot.child("image").getValue().toString();
Picasso.get().load(reciverimage).into(holder.reciverProfileImage);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
holder.recivermsgtext.setVisibility(View.GONE);
holder.reciverProfileImage.setVisibility(View.GONE);
holder.sendermsgtext.setVisibility(View.GONE);
holder.sendermsgImage.setVisibility(View.GONE);
holder.recivermsgImage.setVisibility(View.GONE);
holder.senderTime.setVisibility(View.GONE);
holder.reciverTime.setVisibility(View.GONE);
holder.senderimageTime.setVisibility(View.GONE);
holder.reciverimageTime.setVisibility(View.GONE);
holder.downloadButton.setVisibility(View.GONE);
if (fromMessageType.equals("Text")){
String Messagetime = Message.getTime();
String Messagetext = Message.getMessage();
textmsgmethod(msgsenderid,fromuserid,holder,Messagetime,Messagetext);
}
帮助我,以便我可以从我的应用项目中删除此错误。
最佳答案
每次导航回 Activity 时都会调用 onStart()
方法。因此,每次执行 Firebase 子事件监听器时,您都会得到重复的内容,这是很自然的:
rootRef.child("Message").child(CurrentUserId).child(msgReciverId).addChildEventListener(...)
您应该将此调用移至 onCreate()
方法以避免这种情况。
或者,您可以在 onStop()
方法中清除回收器 View 项。
以下是有关 Activity 生命周期的更多信息 https://developer.android.com/guide/components/activities/activity-lifecycle
此外,您应该在 onBindViewHolder(...)
中使用 addListenerForSingleValueEvent(...)
而不是 addValueEventListener(...)
> 因为 addValueEventListener(...)
将继续监听您的数据库更改,而 addListenerForSingleValueEvent(...)
仅检索您的数据一次。
关于java - 当 Intent 返回我的 Activity 时,在回收 View 中显示两倍的相同数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59541295/