通知 Adapter、Activity/Fragment 或 POJO 接收来自 API改造的实时消息?

问题描述

我很困惑,不知道我的适配器类可以像 Whatsapp 或任何其他信使一样实时获取消息。我正在从服务器获取消息,但只有当我刷新我的活动时,才不会在不刷新的情况下获取消息,那么我如何通知和更新我的适配器或活动以实时获取消息,就像信使一样,而无需刷新或重新打开我的活动。 示例:我正在从我的模拟器发送一条消息并在我的手机上的 ChatActivity 中接收它,我只想在我的 ChatActivity 中接收已发送的消息,同时它在我的手机中打开而不刷新或重新打开我的活动。 提前谢谢....

我的适配器类:

public class ChatAdapter extends RecyclerView.Adapter {

    private static final int VIEW_TYPE_MESSAGE_SENT = 1;
    private static final int VIEW_TYPE_MESSAGE_RECEIVED = 2;
    ArrayList<Messages> mMessageList;
    Context mContext;

    public ChatAdapter(Context context,ArrayList<Messages> messageList) {
        mContext = context;
        mMessageList = messageList;
    }

    // Inflates the appropriate layout according to the ViewType.
    @Override
    public RecyclerView.@NotNull ViewHolder onCreateViewHolder(@NotNull ViewGroup parent,int viewType) {
        View view;

        if (viewType == VIEW_TYPE_MESSAGE_SENT) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_send_message,parent,false);
            return new SentMessageHolder(view);
        } else if (viewType == VIEW_TYPE_MESSAGE_RECEIVED) {
            view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.row_received_message,false);
            return new ReceivedMessageHolder(view);
        }

        return null;
    }

    // Determines the appropriate ViewType according to the sender of the message.
    @Override
    public int getItemViewType(int position) {
        Messages message = mMessageList.get(position);

        if (message.getSendby().equals("user")) {
            // 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;
        }
    }

    // Passes the message object to a ViewHolder so that the contents can be bound to UI.
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder,int position) {
        Messages message = mMessageList.get(position);

        switch (holder.getItemViewType()) {
            case VIEW_TYPE_MESSAGE_SENT:
                ((SentMessageHolder) holder).bind(message);
                break;
            case VIEW_TYPE_MESSAGE_RECEIVED:
                ((ReceivedMessageHolder) holder).bind(message);
        }
    }

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


    static class SentMessageHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.txtSendMessage)
        TextView txtSendMessage;

        SentMessageHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }

        void bind(Messages message) {
            txtSendMessage.setText(message.getMessages());
        }
    }

    static class ReceivedMessageHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.text_gchat_message_other)
        TextView text_gchat_message_other;

        ReceivedMessageHolder(View itemView) {
            super(itemView);
            ButterKnife.bind(this,itemView);
        }

        void bind(Messages message) {
            text_gchat_message_other.setText(message.getMessages());

        }
    }}

聊天活动: 点击发送消息:

public void sendMessage(View view) {
        try {
            message = etMessage.getText().toString();

            Api.getClient().sendMessage(bookingID,userId,providerId,message).enqueue(new Callback<ArrayList<Messages>>() {
                @Override
                public void onResponse(@NotNull Call<ArrayList<Messages>> call,@NotNull Response<ArrayList<Messages>> response) {
                    if (response.isSuccessful()) {
                        etMessage.setText("");
                        getMessageList();
                    }

                }

                @Override
                public void onFailure(@NotNull Call<ArrayList<Messages>> call,@NotNull Throwable t) {
                    Toast.makeText(ChatActivity.this,"" + t.getMessage(),Toast.LENGTH_SHORT).show();
                }
            });
        } catch (Exception e) {
            Toast.makeText(this,"" + e.getMessage(),Toast.LENGTH_SHORT).show();
        }

    }

聊天活动: 获取消息列表(消息历史):

 private void getMessageList() {
        loading.show();
        Api.getClient().getMessageList(bookingID).enqueue(new Callback<ArrayList<Messages>>() {
            @Override
            public void onResponse(@NotNull Call<ArrayList<Messages>> call,@NotNull Response<ArrayList<Messages>> response) {
                if (response.isSuccessful()) {
                    chatAdapter = new ChatAdapter(ChatActivity.this,response.body());
                    recyclerView.setAdapter(chatAdapter);
                    loading.dismiss();
                }

            }

            @Override
            public void onFailure(@NotNull Call<ArrayList<Messages>> call,@NotNull Throwable t) {
                Toast.makeText(ChatActivity.this,Toast.LENGTH_SHORT).show();
            }
        });
    }

onCreate():

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        ButterKnife.bind(this);
        getwindow().setStatusBarColor(getResources().getColor(R.color.color_background));
        loading = MyUtils.getLoadingDialog(this);
        bookingID = getIntent().getIntExtra("bookingId",0);
        userId = getIntent().getIntExtra("userId",0);
        providerId = getIntent().getIntExtra("providerId",0);
        getMessageList();
    }

解决方法

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

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

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