首页 > 解决方案 > 当意图返回我的活动时,在回收视图中显示两倍的相同数据

问题描述

我创建了一个使用 firebase 显示聊天消息的活动。当我们第一次打开我们的活动时,它工作正常并且显示来自数据库的消息一次并且看起来不错但是一旦我们发送新消息或尝试意图进行新活动并且一旦我们回到显示消息的相同活动。在那个活动中,聊天数据显示了三次,我们再次发送消息,它显示了四次......因为我是 android 领域的新手,我已经尝试了所有的想法,但没有一个有效。

下面是包含回收器视图的个人聊天活动的 onstart 方法的代码,当它启动时,我连接到消息采用者,然后使用从数据库中检索数据的消息类执行将值传递给回收视图的过程.

个人聊天.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);
 }

帮助我,以便我可以从我的应用程序项目中删除此错误。

标签: javaandroidandroid-recyclerview

解决方案


onStart()每次导航回活动时都会调用该方法。因此,每次执行 Firebase 子事件侦听器时,您都会自然而然地得到重复:

rootRef.child("Message").child(CurrentUserId).child(msgReciverId).addChildEventListener(...)

您应该将此调用移至您的onCreate()方法以避免这种情况。

或者,您可以在您的onStop()方法中清除您的回收站视图项目。

以下是有关活动生命周期的更多信息https://developer.android.com/guide/components/activities/activity-lifecycle

此外,您应该使用addListenerForSingleValueEvent(...)而不是addValueEventListener(...)in your onBindViewHolder(...)sinceaddValueEventListener(...)将继续监听您的数据库更改,而addListenerForSingleValueEvent(...)只检索您的数据一次。


推荐阅读