Я смущен тем, что мой класс адаптера не может получать сообщения в реальном времени, например, 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();
}
ChatAdapter
, поэтому я не понимаю, как это имеет значение? - person a_local_nobody   schedule 12.03.2021where should I implement clear, add and notify
ну подумай об этом. откуда вы берете новые данные? это было бы внутри onResponse, верно? - person a_local_nobody   schedule 12.03.2021