Не удалось обновить список recyclerview после добавления отправки сообщения чата в Android с использованием Java

#android #android-recyclerview #android-adapter

#Android #android-recyclerview #android-адаптер

Вопрос:

Мне нужно добавить сообщение в мой recyclerview в Android. Но не удалось добавить в список после добавления notifyDataSetChaged().

Вот мой код

Используется адаптер и фрагмент.

Адаптер покажет сообщение получателя и отправителя слева и справа в соответствии с идентификатором пользователя. Идентификатор владельца привязки используется для отображения списка собственных пользовательских и других пользовательских сообщений слева и справа так же, как и у wapp.

Фрагмент чата:

    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.notifyItemInserted(newMsgPosition);
                    // 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());
}
 

Комментарии:

1. Попробуйте добавить mChatMessageRecyclerView.requestLayout(); afert .notifyItemInserted , без .notifyDataSetChanged

2. Многие фрагменты кода отсутствуют, поэтому это сложно …… Однако вы уведомляете, используя «notifyItemInserted (newMsgPosition)», но прокрутка до position = 0, и если значение «newMsgPosition» достаточно велико, тогда этот новый элемент выходит за пределы первой страницы ListView, и представление не обновляется до прокрутки до»scrollToPosition (newMsgPosition)». Но это всего лишь предположение, потому что неясно, как вы добавляете и получаете элементы….

3. Вы когда-нибудь добавляли сообщение в messageDtoList ? Похоже, вы звоните notifyDatasetChanged , даже не меняя данные?

4. Ну, у вас есть список в адаптере, который вы заполнили элементами, без добавления новых элементов вы никогда не получите никаких изменений? Оба подхода работают с вашими сообщениями R / L, реально я не думаю, что это будет иметь большое значение.

5. Объяснение этого, похоже, выходит за рамки этого вопроса, вы можете изучить, как сортировать список, там много документации!