Olaf-06
@Olaf-06
Студент

GetAdapterPosition возвращает NO_POSITION (-1) в ViewHolder, что делать?

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 сделать функционал для кнопки "отправки сообщения"
            }
        }
    }
}
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
Olaf-06
@Olaf-06 Автор вопроса
Студент
убрал getAdapterPosition из ViewHolder и немного перестроил код, заработало.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы