【问题标题】:Recyclerview not updating screen onNotifydatasetchangedRecyclerview 未更新屏幕 onNotifydatasetchanged
【发布时间】:2018-06-11 16:43:14
【问题描述】:

我有带有 recyclerview 的聊天应用程序,它工作正常,直到我从通知返回聊天屏幕,当我从通知进入聊天屏幕时,我可以向其他用户发送消息,其他用户可以向我发送消息,但聊天屏幕无论我发送消息还是接收消息,都没有更新。有一个名为chatDatabase() 的功能我注意到,如果我评论该功能,那么即使我从通知中进入聊天屏幕,屏幕也可以完美运行而不会出现任何问题。但我无法弄清楚为什么它不能与chatDatabase() 一起工作

ChatScreenFragment

    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);

        }
    }
}

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

【问题讨论】:

    标签: java android listview android-recyclerview


    【解决方案1】:

    我查看了您的 chatDatabase 函数,并在您在适配器上调用 notifyDataSetChanged 之前发现了一些可疑行为。我在自己的项目中进行了测试,发现如果我尝试在 RecyclerView 上设置 LayoutManager 后,我的渲染也会停止。

    您在一开始就很好地设置了 RecyclerView,因此删除新调用应该可以解决问题,只要 chatDatabase 函数没有任何其他问题。让我知道从 chatDatabase 函数中删除 LayoutManager 行是否可以解决问题!

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

    【讨论】:

    • 我添加了这个来检查它是否工作但它不是。所以我删除了它,但它仍然无法正常工作。您是否发现任何其他问题
    • 我会验证您的message 列表中确实有数据。假设chatDatabase 函数实际上正在正确更新列表,那么您应该已经准备好了。没有什么不寻常的,但由于您在函数的开头调用message.clear(),我会验证您实际上是在添加数据。如果数据集不为空,我会说您的 RecyclerView 不是问题并开始查看数据库逻辑。
    • 我签入了日志,它显示它应该正常运行,当我输入并发送但在我的屏幕上不可见时,其他用户也会收到消息。如果我评论 chatDatabase 函数它开始正常工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 2020-09-03
    • 2019-03-29
    相关资源
    最近更新 更多