首页 > 解决方案 > 如何在 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) {

        }
    });
}

标签: androidfirebaseandroid-recyclerviewonresumeonpause

解决方案


// 避免 recyclerview 闪烁

((SimpleItemAnimator) myRecyclerview.getItemAnimator()).setSupportsChangeAnimations(false);

或者

myRecyclerview.setItemAnimator(null);

初始化 myRecyclerview 后立即执行此操作


推荐阅读