首页 > 解决方案 > 在recyclerview列表中添加项目时,它将更改聊天室中的所有消息,底部已经可用的消息

问题描述

我已经使用 recyclerview 来显示所有列表。此处聊天消息已添加到列表中。它被添加了,但 UI 中显示的消息是我已经添加的最后一条消息。

为什么所有列表都随着列表中的最后一条消息而更改。

注意:它没有显示我最近发送的消息

Chat Fragment:
 
 private final MyMessageModel[] msglist = new ArrayList<>().toArray(new MyMessageModel[0]);
       public void onviewCreated() {
        
         mSendMsg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String msgContent = mSendMsgInputBox.getText().toString();
        
                    if(!TextUtils.isEmpty(msgContent))
                    {
                        execute(new PostMessageRequest( msgContent,getmId()), mPostMessageListener);
                        int i1 = msharedprefs.getInt(msgContent, 0);
                        i1 += 1;
                        SharedPreferences.Editor editor = msharedprefs.edit();
                        editor.putInt(msgContent, i1);
                        editor.commit();
                        int newMsgPosition = messagesList.size();
                        System.out.println("newMsgPosition ==" + newMsgPosition);
        
                        // Notify recycler view insert one new data.
                        mAdapter.setData(msglist);

                        // Scroll RecyclerView to the last message.
                        //mChatMessageRecyclerView.scrollToPosition(0);
        
                     
                        mSendMsgInputBox.setText("");
                        mAdapter.notifyDataSetChanged();
        
                    }
                }
            });
        
        My Adapter:

 
           private static final int VIEW_TYPE_MESSAGE_SENT = 1;
            private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
            private List<MyMessageModel> msgDtoList; 
            MyMessageModel msgDto = this.msgDtoList.get(position);
             
    
             @Override
        public int getItemViewType(int position) {
            MyMessageModel message = (MyMessageModel) msgDtoList.get(position);
    
            if (message.getId().equals(Profile.getId())) {
                // If the current user is the sender of the message
                return VIEW_TYPE_MESSAGE_SENT;
            } else {
                // If some other user sent the message
                return VIEW_TYPE_MESSAGE_RECEIVED;
            }
        }
    
     @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view;
    
            if (viewType == VIEW_TYPE_MESSAGE_SENT) {
                view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.sender_message_layout, parent, false);
                return new SenderMessageHolder(view);
    
            } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
                view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.receiver_message_layout, parent, false);
                return new ReceiverMessageHolder(view);
            }
        return null;
        }
                 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
                    LastMessageContent message = (LastMessageContent) msgDtoList.get(position);
                
                    switch (holder.getItemViewType()) {
                        case VIEW_TYPE_MESSAGE_SENT:
                            populateSentViewHolder(holder, position);   break;
                        case VIEW_TYPE_MESSAGE_RECEIVED:
                            populateReceivedViewHolder(holder, position);
                
                    }
    
     @SuppressLint("ResourceAsColor")
        private void populateSentViewHolder(RecyclerView.ViewHolder holder, int position) {
            MyMessageModal msgDto = this.msgDtoList.get(position);
            ((SenderMessageHolder) holder).rightMsgTextView.setText(msgDto.getmMSg());
    }
    
     @SuppressLint("ResourceAsColor")
        private void populateReceivedViewHolder(RecyclerView.ViewHolder holder, int position) {
            MyMessageModal msgDto = this.msgDtoList.get(position);
            ((ReceiverMessageHolder) holder).leftMsgTextView.setText(msgDto.getmMSg());
    }

标签: androidandroid-recyclerviewadapter

解决方案


推荐阅读