如何使用 recyclerview (java) 在 android 中完成消息的分组

问题描述

如何对消息的日期进行分组并在 android 中显示视图。我需要显示与应用相同的日期。

如何显示消息视图。

是否需要在单独的 viewholder 和单独的 xml显示分组日期视图,然后日期将在两个视图中进行排序? (发送方和接收方视图持有者)

enter image description here

适配器:

public class ChatMessageAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


 private List<Messages> msgDtoList;
 private final List<Messages> mData;

 public static final int VIEW_TYPE_SENDER = 1;
 public static final int VIEW_TYPE_RECEIVER = 2;

  public ChatMessageAdapter(List<Messages> msgDtoList) {
            this.msgDtoList = msgDtoList;
           mData = msgDtoList;
        }

        public void setData(@Nullable Messages[] data) {
           
            msgDtoList.clear();
            for (Messages model : data) {
                if (model instanceof Messages) {
                    mData.add(model);
                    continue;
                }
}

      @Override
        public int getItemViewType(int position) {
            Messages msgDto = this.msgDtoList.get(position);
               
            if (msgDto.getmSender().getId() == Profile.getInstance().getId()) {
                return VIEW_TYPE_SENDER;
            }

            else {
                return VIEW_TYPE_RECEIVER;
            }

        }

       @Override
        public int getItemCount() {
            return msgDtoList.size();
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder,int position) {
            View v;
           

            if(mMessages.getmSender().getId() == Profile.getInstance().getId()) {
                sentViewHolder(holder,position);
              
            } else if  (msgDto.getmSender().getId() != Profile.getInstance().getId()) {
               receivedViewHolder(holder,position);
               
            }
        }

  @SuppressLint("ResourceAsColor")
        private void sentViewHolder(RecyclerView.ViewHolder holder,int position) {
            Messages msgDto = this.msgDtoList.get(position);
            ((SenderMessageHolder)holder).rightMsgTextView.setText(msgDto.getmMSg());
            ((SenderMessageHolder)holder).mDateTimestamp.setText(msgDto.getmTimestamp());
            ((SenderMessageHolder)holder).rightMsgTextView.setTextColor(R.color.yellow);
            ((SenderMessageHolder)holder).rightMsgTextView.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
        }

        @SuppressLint("ResourceAsColor")
        private void receivedViewHolder(RecyclerView.ViewHolder holder,int   position) {
            Messages msgDto = this.msgDtoList.get(position);
            ((ReceiverMessageHolder)holder).leftMsgTextView.setText(msgDto.getmMSg());
            ((ReceiverMessageHolder)holder).mDateTimestamp.setText(msgDto.getmTimestamp());
            ((ReceiverMessageHolder)holder).leftMsgTextView.setTextColor(R.color.red);
            ((ReceiverMessageHolder)holder).leftMsgTextView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
            Messages msgDto = this.msgDtoList.get(viewType);
           
            if (msgDto.getmSender().getId() == Profile.getInstance().getId() ) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.sender_message_layout,parent,false);
                return new SenderMessageHolder(view);
            } else {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.receiver_message_layout,false);
                return new ReceiverMessageHolder(view);
            }
        }

    }
}

在 ChatFragment.java 中

  @Override
        public void onViewCreated(View v,@Nullable Bundle b) {
            super.onViewCreated(v,b);
     mChat = (TextView) v.findViewById(R.id.chat_messages);
            mSendMsginputBox = (EditText) v.findViewById(R.id.chat_input_msg);
            mSendMsg = (ImageView) v.findViewById(R.id.chat_send_msg);
            mChatMessageRecyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);
    
            linearlayoutmanager linearlayoutmanager = new linearlayoutmanager(getActivity());
            linearlayoutmanager.setorientation(linearlayoutmanager.VERTICAL);
            linearlayoutmanager.setStackFromEnd(true);
            linearlayoutmanager.setSmoothScrollbarEnabled(true);
           
            mChatMessageRecyclerView.setLayoutManager(linearlayoutmanager);
    
            final List<Messages> msgDtoList = new ArrayList<LastMessageContent>();
            int newMsgPosition = msgDtoList.size() - 1;
           
            mChatMessageRecyclerView.scrollToPosition(0);
          
    
            mChatMessageRecyclerView.setLayoutManager(new linearlayoutmanager(getActivity(),linearlayoutmanager.VERTICAL,false));
            mChatMessageRecyclerView.setHasFixedSize(true);
            mChatMessageRecyclerView.setAdapter(mAdapter);
    
            ArrayList<Messages> messagesList = new ArrayList<>();
            for (int i=0;i<10;i++) {
               // messagesList.add(new LastMessageContent( mSendMsginputBox.getText().toString(),Profile.getInstance().getId() == mChatMessage.getmSender().getId() ? ChatMessageAdapter.VIEW_TYPE_SENDER : ChatMessageAdapter.VIEW_TYPE_RECEIVER));
            }
    
         
    
    
            List<List<Messages>> itemList = new ArrayList<>();
            mSendMsg.setonClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String msgContent = mSendMsginputBox.getText().toString();
    
                    if(!TextUtils.isEmpty(msgContent))
                    {
                        
                        Messages msgDto = mChatMessage.getmessages();
                        msgDtoList.add(msgDto);
                        itemList.add(msgDtoList);
                       
                        mAdapter.notifyDataSetChanged();
                       
                        if (mSendMsginputBox.toString() != "") {
                           
                            LastMessageContent msgDto1 = new LastMessageContent(mChatMessage.getmLastMessageContent().getmMSg(),mChatMessage.getId());
                            System.out.println("msgDto1msgDto1 ==" + msgDto1);
                            msgDtoList.add(msgDto1);
    
                        }
                        mAdapter.registeradapterDataObserver(new RecyclerView.AdapterDataObserver() {
                            @Override
                            public void onItemRangeInserted(int positionStart,int itemCount) {
                                super.onItemRangeInserted(positionStart,itemCount);
                                int messageCount = mAdapter.getItemCount();
                                int lastVisiblePosition =
                                        linearlayoutmanager.findLastCompletelyVisibleItemPosition();
                                // If the recycler view is initially being loaded or the
                                // user is at the bottom of the list,scroll to the bottom
                                // of the list to show the newly added message.
                                if (lastVisiblePosition == -1 ||
                                        (positionStart >= (friendlyMessageCount - 1) &&
                                                lastVisiblePosition == (positionStart - 1))) {
                                    mChatMessageRecyclerView.scrollToPosition(positionStart);
                                }
                            }
                        });
                    }
                }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)