java - 当意图返回我的活动时,在回收视图中显示两倍的相同数据
问题描述
我创建了一个使用 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);
}
帮助我,以便我可以从我的应用程序项目中删除此错误。
解决方案
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(...)
只检索您的数据一次。
推荐阅读
- python-3.x - 如何使用另一个列的内容创建一个新的 pandas 数据框列,但前提是另一列满足条件?
- angular - 用 Jasmine 模拟测试 if/else
- artifactory - Artifactory Cloud - 组令牌上的令牌主体不匹配
- angular - onSelectionChange 角度,模板侧检查
- reactjs - 尽管 CSS 中存在错误,如何构建 React 应用程序
- sql - 在 oracle sql 中透视时出现无效标识符错误
- laravel - Laravel HasMany 与 where 条件
- java - 格式化 ZonedDateTime 并返回 ZonedDateTime
- python - 如何获取熊猫数据框中每个日期的最大值
- python - 合并连续和重叠的日期范围