Уведомить адаптер, действие / фрагмент или 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, parent, 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());

        }
    }}

ChatActivity: OnClick для отправки сообщений:

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

    }

ChatActivity: получение списка сообщений (история сообщений):

 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, "" + t.getMessage(), 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();
    }

person Creative Zaidi    schedule 12.03.2021    source источник
comment
зачем вы создаете новые адаптеры для отправки и получения каждый раз? создайте один адаптер, установите его на свой ресайклер. при поступлении новых данных удалите старые данные в адаптере, передайте ему новые данные, уведомите адаптер   -  person a_local_nobody    schedule 12.03.2021
comment
Привет! Вот как создается мой API. Один адаптер предназначен для временного чата во время чата, а другой - для истории сообщений, и где мне реализовать очистку и обновление адаптера?   -  person Creative Zaidi    schedule 12.03.2021
comment
оба раза вы используете ChatAdapter, поэтому я не понимаю, как это имеет значение?   -  person a_local_nobody    schedule 12.03.2021
comment
Где вы вызываете метод getMessageList ()?   -  person HyeonSeok    schedule 12.03.2021
comment
в onCreate getMessageList ();   -  person Creative Zaidi    schedule 12.03.2021
comment
@a_local_nobody, спасибо, что вы были правы, вызывая тот же адаптер в SendMessage (), теперь я обновил свой код, пожалуйста, проверьте это и, пожалуйста, помогите мне!   -  person Creative Zaidi    schedule 12.03.2021
comment
ничего из того, что я сказал, не изменилось :) сделайте один переходник. когда вы получаете новые данные, удалите старые данные в адаптере, передайте ему новые данные, уведомите адаптер об изменении   -  person a_local_nobody    schedule 12.03.2021
comment
@a_local_nobody, где мне реализовать очистку, добавление и уведомление?   -  person Creative Zaidi    schedule 12.03.2021
comment
@CreativeZaidi Если вы хотите получать данные из своего API и постоянно обновлять список, вы должны вызвать метод getMessageList () в цикле. Поиск про вытягивание опроса. Или выполните поиск по fcm   -  person HyeonSeok    schedule 12.03.2021
comment
where should I implement clear, add and notify ну подумай об этом. откуда вы берете новые данные? это было бы внутри onResponse, верно?   -  person a_local_nobody    schedule 12.03.2021
comment
@a_local_nobody Я отправляю сообщение из своего эмулятора и получаю его на свой телефон в ChatActivity, я просто хочу получать это отправленное сообщение в моем ChatActivity, пока оно открыто в моем телефоне, без обновления или повторного открытия моей активности.   -  person Creative Zaidi    schedule 12.03.2021
comment
@CreativeZaidi Kotlin Coroutine Live Data - лучшее решение для решения этой проблемы в современном программировании. Вы хотите использовать Котлин?   -  person NRUSINGHA MOHARANA    schedule 12.03.2021
comment
@NRUSINGHAMOHARANA, но я разработчик Java, как я могу сделать это на Java?   -  person Creative Zaidi    schedule 12.03.2021
comment
@CreativeZaidi Ну, это тоже можно сделать с помощью Java. Вы использовали Live Data?   -  person NRUSINGHA MOHARANA    schedule 12.03.2021
comment
@NRUSINGHAMOHARANA нет, не могли бы вы рассказать мне о LiveData?   -  person Creative Zaidi    schedule 12.03.2021
comment
ну, моя проблема решается с помощью Handler каждые 1 секунду, но я не думаю, что это эффективный способ сделать это, у вас, ребята, есть какой-нибудь эффективный способ?   -  person Creative Zaidi    schedule 12.03.2021
comment
@CreativeZaidi Использование обработчика - немедленное решение вашей проблемы. Но было бы лучше, если бы вы следовали современным стандартам, таким как Live Data, DiffUtil и т. Д. medium.com/@guendouz/ stackoverflow .com / questions / 44489235 /.   -  person NRUSINGHA MOHARANA    schedule 12.03.2021
comment
Спасибо, ребята, за вашу помощь, Особое спасибо вам @NRUSINGHAMOHARANA   -  person Creative Zaidi    schedule 12.03.2021