FATAL EXCEPTION: main
Process: com.siltech.automax, PID: 32363
java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.get(ArrayList.java:439)
at com.siltech.automax.ui.chat.MessagesRecyclerViewAdapter$ViewHolder.(MessagesRecyclerViewAdapter.java:38)
at com.siltech.automax.ui.chat.MessagesRecyclerViewAdapter.onCreateViewHolder(MessagesRecyclerViewAdapter.java:97)
at com.siltech.automax.ui.chat.MessagesRecyclerViewAdapter.onCreateViewHolder(MessagesRecyclerViewAdapter.java:19)
public class MessagesRecyclerViewAdapter extends RecyclerView.Adapter<MessagesRecyclerViewAdapter.ViewHolder> {
ArrayList<Message> messages;
MessagesRecyclerViewAdapter(ArrayList<Message> messages) {
this.messages = messages;
}
class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView tvMessage;
TextView tvNameOfFile;
TextView tvWeightOfFile;
ImageButton btnDownloadFile;
int status;
public ViewHolder(@NonNull View itemView) {
super(itemView);
status = messages.get(getAdapterPosition()).getStatus();
if (status == Message.MY_MESSAGE || status == Message.SOMEONE_MESSAGE) {
tvMessage = itemView.findViewById(R.id.tvMessage);
} else {
tvNameOfFile = itemView.findViewById(R.id.tvNameOfFile);
tvWeightOfFile = itemView.findViewById(R.id.tvWeightOfFile);
btnDownloadFile = itemView.findViewById(R.id.btnDownloadFile);
btnDownloadFile.setOnClickListener(this);
}
}
@SuppressLint("NonConstantResourceId")
@Override
public void onClick(View view) {
if (view.getId() == R.id.btnDownloadFile) {
downloadFile(messages.get(getAdapterPosition()).getUri());
}
}
void downloadFile(Uri uri) {
// TODO: 13.01.2023 добавить функционал для закачки файла
}
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = null;
switch (viewType) {
case Message.MY_MESSAGE: {
view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.item_message, parent, false);
break;
}
case Message.MY_MESSAGE_FILE: {
view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.item_message_file, parent, false);
break;
}
case Message.SOMEONE_MESSAGE: {
view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.item_someone_else_message_, parent, false);
break;
}
case Message.SOMEONE_MESSAGE_FILE: {
view = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.item_someone_else_message_file, parent, false);
break;
}
}
assert view != null;
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MessagesRecyclerViewAdapter.ViewHolder holder, int position) {
int status = holder.status;
if(status == Message.MY_MESSAGE || status == Message.SOMEONE_MESSAGE){
holder.tvMessage.setText(messages.get(position).getMessage());
} else {
holder.tvNameOfFile.setText(messages.get(position).getNameFile());
holder.tvWeightOfFile.setText(messages.get(position).getWeightOfFile());
}
}
@Override
public int getItemCount() {
return messages.size();
}
@Override
public int getItemViewType(int position) {
return messages.get(position).getStatus();
}
}
public class ChatActivity extends AppCompatActivity implements View.OnClickListener {
ImageButton btnChatBack;
ImageView imgChatUser;
TextView tvNameOfUser;
TextView tvUserOnline;
ImageButton btnChatCall;
RecyclerView rvMessages;
ImageButton btnSmile;
EditText etMessage;
ImageButton btnFile;
ImageButton btnSendMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
//фотография юзера, с которым ведётся общение
imgChatUser = findViewById(R.id.imgChatUser);
//имя юзера, с которым ведётся общение
tvNameOfUser = findViewById(R.id.tvNameOfUser);
//статус юзера, онлайн или нет
tvUserOnline = findViewById(R.id.tvUserOnline);
//поле ввода сообщений
etMessage = findViewById(R.id.etMessage);
//Стрелочка выхода из чата
btnChatBack = findViewById(R.id.btnChatBack);
btnChatBack.setOnClickListener(this);
//Звонок
btnChatCall = findViewById(R.id.btnChatCall);
btnChatCall.setOnClickListener(this);
//кнопка со смайликами
btnSmile = findViewById(R.id.btnSmile);
btnSmile.setOnClickListener(this);
//кнопка рядом с полем для ввода сообщений, связанный с загрузкой файлов
btnFile = findViewById(R.id.btnFile);
btnFile.setOnClickListener(this);
//кнопка отправки сообшения
btnSendMessage = findViewById(R.id.btnSendMessage);
btnSendMessage.setOnClickListener(this);
//тестовый массив для отображения в recyclerView
ArrayList<Message> messages = new ArrayList<>();
//посмотрите класс Message, там всё расписано
messages.add(new Message("Моё сообщение", false));
messages.add(new Message("Чужое сообщение", true));
messages.add(new Message("Мой файл", "1 mb", Uri.parse(""), false));
messages.add(new Message("Чужой файл", "2 mb", Uri.parse(""), true));
rvMessages = findViewById(R.id.rvMessages);
rvMessages.setLayoutManager(new LinearLayoutManager(this));
rvMessages.setAdapter(new MessagesRecyclerViewAdapter(messages));
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnChatBack: {
// TODO: 13.01.2023 сделать функционал для кнопки "назад"
}
case R.id.btnChatCall: {
// TODO: 13.01.2023 сделать функционал для кнопки "звонок"
}
case R.id.btnSmile: {
// TODO: 13.01.2023 сделать функционал для кнопки "смайлики"
}
case R.id.btnFile: {
// TODO: 13.01.2023 сделать функционал для кнопки "прикрепление файла"
}
case R.id.btnSendMessage: {
// TODO: 13.01.2023 сделать функционал для кнопки "отправки сообщения"
}
}
}
}