代码之家  ›  专栏  ›  技术社区  ›  androidXP

RecyclerView未更新屏幕onNotifyDataSetChanged

  •  2
  • androidXP  · 技术社区  · 6 年前

    我有一个与RecyclerView聊天应用程序,它的工作正常,直到我回来聊天屏幕从通知,当我来聊天屏幕从通知,我可以发送消息给其他用户和其他用户可以发送消息给我,但聊天屏幕没有更新,无论我发送消息或我收到。调用了函数 chatDatabase() 我注意到,如果我评论这个功能,那么屏幕就可以完美地工作,没有任何问题,即使我从通知进入聊天屏幕。但我不明白为什么它不能与 聊天数据库()

    聊天屏幕片段

        public class Chat_Screen_Fragment extends Fragment implements View.OnClickListener, ChildEventListener{
    
        public static final String TAG = "###CHAT SCREEN###";
    
        List<Chat_Wrapper> message = new ArrayList<>();
    
    
        Chat_Adapter adapter;
        RecyclerView recyclerView;
        LinearLayoutManager layoutManager;
    
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            View v=inflater.inflate(R.layout.chat_screen_main_fragment,container,false);
            setRetainInstance(true);
    
    
    
            // GET INTENT VALUES FROM USER PROFILE CLASS
    
            UserName_Intent = getArguments().getString("Get_Name");
            UserImage_Intent = getArguments().getString("Get_Image");
            UserPhone_Intent = getArguments().getString("Get_Phone");
            UserID_Intent = getArguments().getString("Get_ID");
            FirebaseToken_Intent = getArguments().getString("Get_Token"); //Firebase Token of other person
            Room_Name_Intent = getArguments().getString("Get_Other"); // Room Name of chat
            UserLastSeen_Intent=getArguments().getString("LastSeen");
            //Sender_FCMToken = Session.getFirebaseID();
    
    
    
    
    
    
    
            // RECYCLER VIEW
            recyclerView = v.findViewById(R.id.Chat_Screen_Message_List);
            layoutManager = new LinearLayoutManager(getActivity());
            layoutManager.setStackFromEnd(true);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(layoutManager);
    databaseReference = FirebaseDatabase.getInstance().getReference().child(Room_Name_Intent);
            databaseReference.addChildEventListener(this);
    
            adapter = new Chat_Adapter(getActivity(), message);
            recyclerView.setAdapter(adapter);
            // FETCH OLD MESSAGE FROM DATABASE
            chatDatabase();
            return v;
        }
    
    
    
        // FIREBASE REAL TIME DATABASE WHICH FETCH ALL MESSAGES (SYNC) FROM ONLINE DATABASE
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            append_chat_conversation(dataSnapshot);
        }
    
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            append_chat_conversation(dataSnapshot);
        }
    
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
    
        }
    
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
    
        }
    
    
    
    
    
        private synchronized void append_chat_conversation(DataSnapshot dataSnapshot) {
            iterator = dataSnapshot.getChildren().iterator();
    
    
            while (iterator.hasNext()) {
                // NOW GET ALL DATA FROM FIREBASE DATABASE AND SAVE IT INTO STRINGS THEN CHECK EACH BY ITS MESSAGE TYPE
                Chat_Msg = (String) ((DataSnapshot) iterator.next()).getValue();
                Chat_FROM = (String) ((DataSnapshot) iterator.next()).getValue();
                Chat_FCM_TO= (String) ((DataSnapshot) iterator.next()).getValue();
    
                Chat_Database tempChatDatabase = new Chat_Database(getActivity());
                boolean hasValue=tempChatDatabase.CheckValueExist(_ID);
    
    
                if (!hasValue) {
                    Log.d(TAG,"Chat Message "+Chat_Msg);
    
    
                        long id=chat_database.Insert_Chat(Session.getUserID(),Room_Name_Intent, UserID_Intent, "Text", Chat_Msg, Chat_FROM, Chat_TO, Chat_TimeStamp, Chat_FCM_FROM, Chat_FCM_TO, Session.getPhoneNO(), UserPhone_Intent,Random_ID,UserImage_Intent,UserLastSeen_Intent,Chat_FROM_ID);
    
                        //Adding Chat Data Into Database
                        Log.d(TAG,"Database Entry ID "+id);
                        if (id==0){
                            Log.d(TAG,"Database Already Has Value Of This Random Id ");
                            return;
                        }
                        Chat_Wrapper chat_wrapper = new Chat_Wrapper(Chat_Msg, null, null, null, null, null, null, Chat_TimeStamp, User_Intent, UserImage_Intent, Chat_FROM, null,null,id);
                        message.add(chat_wrapper);
                      adapter.notifyDataSetChanged();
                    Log.d(TAG, "FIREBASE STORAGE PHOTO-3-MESSAGE ARRAY SIZE " + message.size());
                    recyclerView.post(new Runnable() {
                        @Override
                        public void run() {
                            Log.d(TAG, "Moving to Bottom");
                            recyclerView.smoothScrollToPosition(adapter.getItemCount());
    
                        }
                    });
    
                    }               
    
                    }
    
                }
    
                Log.d(TAG, "MESSAGE ARRAY SIZE " + message.size());
    
                tempChatDatabase.isDatabaseClose();
            }
    
            adapter.notifyDataSetChanged();
            recyclerView.post(new Runnable() {
                @Override
                public void run() {
                    Log.d(TAG, "Moving to Bottom");
                    recyclerView.smoothScrollToPosition(message.size()-1);
                    //recyclerView.smoothScrollToPosition(adapter.getItemCount());
    
                }
            });
        }
    
    
    
        private void chatDatabase(){
            //Database Init and Filling Adapter
            Log.d(TAG,"Chat Database Function");
            chat_database=new Chat_Database(getActivity());
            chatCursor=chat_database.getUserChat(UserID_Intent);
            boolean checkDB_Exist=functions.DatabaseExist(getActivity(),"CHAT_DATABASE.DB");
            boolean chatItemsCounts=chatCursor.getCount()>0;
            chatCursor.moveToFirst();
            Log.d(TAG,"Value At Chat Database "+ checkDB_Exist+" "+chatItemsCounts);
            if (checkDB_Exist && chatCursor.getCount()>0 && chatCursor.getString(chatCursor.getColumnIndex("RECEIVER_USER_ID")).equals(UserID_Intent)){
    
                Log.d(TAG,"Database Exist Chat Database");
                message.clear();
                chatCursor.moveToFirst();
                do {
                    database_rowID=chatCursor.getInt(chatCursor.getColumnIndex("ID"));
                    database_userID=chatCursor.getString(chatCursor.getColumnIndex("USER_ID"));
                    database_RoomName =chatCursor.getString(chatCursor.getColumnIndex("ROOM_NAME"));
                    database_ReceiverID=chatCursor.getString(chatCursor.getColumnIndex("RECEIVER_USER_ID"));
                    database_MessageType=chatCursor.getString(chatCursor.getColumnIndex("MESSAGE_TYPE"));
                    database_Message=chatCursor.getString(chatCursor.getColumnIndex("USER_MESSAGE"));
                    database_MsgFrom=chatCursor.getString(chatCursor.getColumnIndex("SENDER_NAME"));
                    database_MsgTo=chatCursor.getString(chatCursor.getColumnIndex("RECEIVER_NAME"));
                    database_TimeStamp=chatCursor.getString(chatCursor.getColumnIndex("TIME_STAMP"));
                    database_FCMfrom=chatCursor.getString(chatCursor.getColumnIndex("SENDER_TOKEN"));
                    database_FCMto=chatCursor.getString(chatCursor.getColumnIndex("RECEIVER_TOKEN"));
                    database_LocalPath=chatCursor.getString(chatCursor.getColumnIndex("DOWNLOADED_AT"));
                    database_PhoneFrom=chatCursor.getString(chatCursor.getColumnIndex("MY_PHONE"));
                    database_PhoneTo=chatCursor.getString(chatCursor.getColumnIndex("OTHER_PHONE"));
    
                    Log.d(TAG,"Value Of Database Message String = "+database_Message);
                    Log.d(TAG,"Row ID of Database "+database_rowID);
                    // Check Message Type
    
    
                        Log.d(TAG,"Message Type Is Text");
                        Chat_Wrapper text = new Chat_Wrapper(database_Message, null, null, null, null, null, null, database_TimeStamp, database_PhoneTo, UserImage_Intent, database_MsgFrom,null,null,database_rowID);
                        message.add(text);
    
    
    
                }
                while(chatCursor.moveToNext());
    
                Room_Name_Intent = database_RoomName;
                layoutManager = new LinearLayoutManager(getActivity());
                recyclerView.setLayoutManager(layoutManager);
                adapter.notifyDataSetChanged();
                chatCursor.close();
                boolean value = chat_database.isDatabaseClose();
                recyclerView.post(new Runnable() {
                    @Override
                    public void run() {
                        Log.d(TAG, "Moving to Bottom");
                        recyclerView.smoothScrollToPosition(message.size()-1);
    
                    }
                });
                Log.d(TAG,"Value Of Database Close or Not "+value);
    
            }
        }
    }
    

    更新 :我刚注销并再次登录,然后从通知进入聊天屏幕,然后它工作正常。另外,如果我从最近的应用程序中删除应用程序,它也会工作,但我仍然无法理解为什么会发生这种情况。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Aaron    6 年前

    我看了你的 chatDatabase 在你打电话之前发现一些可疑的行为 notifyDataSetChanged 在适配器上。我在自己的项目中进行了测试,发现如果设置了RecyclerView的LayoutManager,渲染也会停止。

    您在开始时就设置了RecyclerView,因此删除新的调用可以解决问题,只要 聊天数据库 功能。如果从 聊天数据库 功能解决问题!

    layoutManager = new LinearLayoutManager(getActivity()); recyclerView.setLayoutManager(layoutManager); adapter.notifyDataSetChanged();

    推荐文章