我有一个使用RecyclerView来存储聊天的聊天应用程序。聊天包含图像和文本。它使用Firebase数据库存储和检索数据。另外,我还存储了用户的当前状态(在线/离线)。用户的当前状态显示在工具栏中。 onResume()方法将用户状态设置为“在线”,onPause()方法将用户状态设置为“离线”。每次用户更改状态时,整个“回收者视图”都会在另一个用户的UI上闪烁。
因此,在这里,如果我正在向用户发送消息,并且该用户将其状态更改为联机或脱机(显示在工具栏中),则图像会闪烁。另外,如果我向上滚动以查看先前的消息,同时,如果用户更改其状态,则RecyclerView会自动滚动到最后一条。
当用户更改其状态时,如何停止消息的闪烁和自动滚动?
我试图使用ItemAnimator禁用RecyclerView的动画,但是没有用。我不知道这是RecyclerView还是使用Glide库的问题。 这是用于从数据库获取值的代码。
databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
username.setText(user.getName());
if(user.getImageURL().equals("default")){
profile_image.setImageResource(R.mipmap.ic_launcher);
} else {
Glide.with(getApplicationContext()).load(user.getImageURL()).into(profile_image);
}
if(user.getStatus().equals("online")){
status.setText("online");
}else{
status.setText("offline");
}
readMessages(fuser.getUid(), userid, user.getImageURL());
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
这是状态切换代码。
private void status(String status){
databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(fuser.getUid());
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("status", status);
databaseReference.updateChildren(hashMap);
}
@Override
protected void onResume() {
super.onResume();
status("online");
}
@Override
protected void onPause() {
super.onPause();
status("offline");
}
这是每次状态更改时都会闪烁的recyclerview。
private void readMessages(final String myid, final String userid, final String imageURL){
mChats = new ArrayList<>();
databaseReference = FirebaseDatabase.getInstance().getReference("Chats").child(myid).child(userid);
databaseReference.keepSynced(true);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mChats.clear();
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
Chat chats = snapshot.getValue(Chat.class);
if(chats.getReceiver().equals(myid) && chats.getSender().equals(userid) ||
chats.getReceiver().equals(userid) && chats.getSender().equals(myid))
mChats.add(chats);
}
messageAdapter = new MessageAdapter(MessageActivity.this, mChats, imageURL);
recyclerView.setAdapter(messageAdapter);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
答案 0 :(得分:0)
//避免闪烁recyclerview
((SimpleItemAnimator) myRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);
或
myRecyclerview.setItemAnimator(null);
在初始化myRecyclerview后立即执行此操作