java - 当 Intent 返回我的 Activity 时,在回收 View 中显示两倍的相同数据

标签 java android android-recyclerview

我创建了一个使用 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/

相关文章:

java - 父类(super class)引用不应该能够调用其子类独有的方法,但是

由编译器完成的 Java try-with-resource 实现

java - 为什么我们需要在Android中为布局添加膨胀和attachToRoot?

android - 如何在系统用户上运行系统Android App

java - 在 AsyncTask 中使用 Gson 写入/读取 JSON 时发生 android.os.TransactionTooLargeException

java - 使用 Guice 在所有对象中注入(inject)实例

android - 从 android 向服务器发送单个图像

java - 如何限制Recyclerview的滚动移动?

android - 如何使用 onInterceptTouchEvent 从 RecyclerView 中点击特定 View ?

android - 如何使用 RecyclerView 中选定项目的背景启动新 Activity