android - 如何在 onResume() 和 onPause() 之后停止适配器中 RecyclerView 的闪烁?
问题描述
我有一个使用 RecyclerView 来存储聊天的聊天应用程序。聊天包含图像和文本。它使用 Firebase 数据库来存储和检索数据。另外,我已经存储了用户的当前状态(在线/离线)。用户的当前状态显示在工具栏中。onResume() 方法将用户状态设置为“在线”,onPause() 方法将用户状态设置为“离线”。每次用户更改其状态时,整个 Recycler 视图都会在其他用户的 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) {
}
});
}
解决方案
// 避免 recyclerview 闪烁
((SimpleItemAnimator) myRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);
或者
myRecyclerview.setItemAnimator(null);
初始化 myRecyclerview 后立即执行此操作
推荐阅读
- amazon-web-services - 如何使用 helm chart 在 VMWare 的 Kubernetes FluentD Operator 中将 prometheus.enabled 标志设置为 true?
- bash - 除了 grep 之外,还有其他我可以使用的 bash 代码吗?
- java - 如何使用 ssl 将 quarkus 连接到 mongodb
- android - 如何在 Android 片段中渗透布局的差异
- header - 在 React-Native 导航的标题栏中呈现自定义标题组件的问题
- jenkins - 在声明性 Jenkins 的管道工作的每个阶段之后“始终”阻塞
- flutter - 在 Flutter 应用程序中将下载的文件存储在哪里?
- javascript - 循环中限制 API 调用的等待函数
- python - 在 python 2.7 中运行 apt-get update 时出错
- azure-devops - Azure DevOps 执行 Get-AzureADServicePrincipal cmdlet 所需的权限是什么?