如何在onResume()和onPause()之后停止Adapter中RecyclerView的闪烁?

时间:2020-07-19 15:24:06

标签: android firebase android-recyclerview onresume onpause

我有一个使用RecyclerView来存储聊天的聊天应用程序。聊天包含图像和文本。它使用Firebase数据库存储和检索数据。另外,我还存储了用户的当前状态(在线/离线)。用户的当前状态显示在工具栏中。 onResume()方法将用户状态设置为“在线”,onPause()方法将用户状态设置为“离线”。每次用户更改状态时,整个“回收者视图”都会在另一个用户的UI上闪烁。

Message Activity Image

因此,在这里,如果我正在向用户发送消息,并且该用户将其状态更改为联机或脱机(显示在工具栏中),则图像会闪烁。另外,如果我向上滚动以查看先前的消息,同时,如果用户更改其状态,则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) {

        }
    });
}

1 个答案:

答案 0 :(得分:0)

//避免闪烁recyclerview

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

myRecyclerview.setItemAnimator(null);

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