getAdapterPosition = -1

0

Cześć. Mam taki problem. Posiadam RecyclerView, w którym itemy rozszerzają się po naciśnięciu oraz posiadają button który pozwala użytkownikowi dodać/usunąć się z tego obiektu. Niestety, raz na jakiś czas metoda getAdapterPosition() zwraca -1 przez co program się wysypuje.

Czy wiecie może jak to obejść, albo co robie tutaj źle ?

ViewHolder

public ViewHolder(@NonNull View itemView){
            super(itemView);
            Log.d(TAG, "ViewHolder: started");
            onTakeSeatButtonClickListener = new OnTakeSeatButtonClickListener() {
                @Override
                public void onTakeSeatBtnClick(Seat seat) {
                    Log.d(TAG, "onTakeSeatBtnClick: started interface - creating passenger process");
                    Log.d(TAG, "onTakeSeatBtnClick: getAdapterPosition = " + getAdapterPosition());

                    if(getAdapterPosition()!=RecyclerView.NO_POSITION){
                        offeredRide_seatAlreadyTakenIcon.setVisibility(View.VISIBLE);
                        offeredRideRecView_takeSeatButton.setText("ZWOLNIJ MIEJSCE");
                        listOfOfferedRides.get(getAdapterPosition()).setNumber_of_free_seats(listOfOfferedRides.get(getAdapterPosition()).getNumber_of_free_seats()-1);
                        listOfOfferedRides.get(getAdapterPosition()).addSeatToOfferedRide(seat);
                        int numberOfFreeSeatsINT = listOfOfferedRides.get(getAdapterPosition()).getNumber_of_free_seats();
                        if(numberOfFreeSeatsINT == 0 || numberOfFreeSeatsINT >= 5){
                            numberOfFreeSeats.setText(numberOfFreeSeatsINT + " wolnych miejsc");
                        } else if (numberOfFreeSeatsINT == 1){
                            numberOfFreeSeats.setText(numberOfFreeSeatsINT + " wolne miejsce");
                        } else {
                            numberOfFreeSeats.setText(numberOfFreeSeatsINT + " wolne miejsca");
                        }
                    }
                }
                @Override
                public void onLeaveSeatBtnClick(int seatID) {
                    Log.d(TAG, "onLeaveSeatBtnClick: started interface - deleting account process");
                    Log.d(TAG, "onLeaveSeatBtnClick: getAdapterPosition = " + getAdapterPosition());
                    offeredRide_seatAlreadyTakenIcon.setVisibility(View.INVISIBLE);
                    offeredRideRecView_takeSeatButton.setText("ZAJMIJ MIEJSCE");
                    listOfOfferedRides.get(getAdapterPosition()).setNumber_of_free_seats(listOfOfferedRides.get(getAdapterPosition()).getNumber_of_free_seats()+1);
                    for (Seat seat : listOfOfferedRides.get(getAdapterPosition()).getListOfSeats()){
                        if(seat.getId_seat() == seatID){
                            listOfOfferedRides.get(getAdapterPosition()).getListOfSeats().remove(seat);
                        }
                    }
                    int numberOfFreeSeatsINT = listOfOfferedRides.get(getAdapterPosition()).getNumber_of_free_seats();
                    if(numberOfFreeSeatsINT == 0 || numberOfFreeSeatsINT >= 5){
                        numberOfFreeSeats.setText(numberOfFreeSeatsINT + " wolnych miejsc");
                    } else if (numberOfFreeSeatsINT == 1){
                        numberOfFreeSeats.setText(numberOfFreeSeatsINT + " wolne miejsce");
                    } else {
                        numberOfFreeSeats.setText(numberOfFreeSeatsINT + " wolne miejsca");
                    }
                    notifyItemChanged(getAdapterPosition());
                }
            };
            card = (CardView) itemView.findViewById(R.id.offeredRideRecView_cardView);
            driver = (TextView) itemView.findViewById(R.id.offeredRideRecView_driver);
            from_where = (TextView) itemView.findViewById(R.id.offeredRideRecView_from_where);
            to_where = (TextView) itemView.findViewById(R.id.offeredRideRecView_to_where);
            time = (TextView) itemView.findViewById(R.id.offeredRideRecView_time);
            date = (TextView) itemView.findViewById(R.id.offeredRideRecView_date);
            numberOfFreeSeats = (TextView) itemView.findViewById(R.id.offeredRideRecView_freeSeats);
            driver_phoneNumber = (TextView) itemView.findViewById(R.id.offeredRideRecView_driver_phone_number);
            driver_car = (TextView) itemView.findViewById(R.id.offeredRideRecView_driver_car);
            driver_description = (TextView) itemView.findViewById(R.id.offeredRideRecView_driver_user_desc);
            expandableLayout = (RelativeLayout) itemView.findViewById(R.id.offeredRideRecView_expandableLayout);

            phoneIcon = (ImageView) itemView.findViewById(R.id.offeredRideRecView_phoneIcon);
            messageIcon = (ImageView) itemView.findViewById(R.id.offeredRideRecView_messageIcon);
            copyIcon = (ImageView) itemView.findViewById(R.id.offeredRideRecView_copyIcon);
            offeredRide_seatAlreadyTakenIcon = (ImageView) itemView.findViewById(R.id.offeredRide_seatAlreadyTakenIcon);
            offeredRide_seatAlreadyTakenIcon.setVisibility(View.INVISIBLE);

            offeredRideRecView_takeSeatButton = (Button) itemView.findViewById(R.id.offeredRideRecView_takeSeatButton);

            card.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    OfferedRide offeredRide = listOfOfferedRides.get(getAdapterPosition());
                    offeredRide.setExpanded(!offeredRide.isExpanded());
                    notifyItemChanged(getAdapterPosition());
                }
            });

            phoneIcon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onPhoneIconClickListener.onPhoneIconClick(listOfOfferedRides.get(getAdapterPosition()).getUser().getUser_phone_number());
                }
            });
            messageIcon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onMessageIconClickListener.onMessageIconClick(listOfOfferedRides.get(getAdapterPosition()).getUser().getUser_phone_number());
                }
            });
            copyIcon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onCopyIconClickListener.onCopyIconClickListener(listOfOfferedRides.get(getAdapterPosition()).getUser().getUser_phone_number());
                }
            });

            offeredRideRecView_takeSeatButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "TAKE/LEAVE onClick: Button TAKE/LEAVE has been clicked");
                    OfferedRide offeredRide = listOfOfferedRides.get(getAdapterPosition());
                    Log.d(TAG, "TAKE/LEAVE onClick: OfferedRide = " + offeredRide);
                    if(offeredRide.getListOfSeats() == null){
                        Log.d(TAG, "TAKE/LEAVE onClick: List of Seats of this OfferedRide is null - adding seat started");
                        if(isNetworkAvailable()){
                            createSeat(offeredRide.getId_offered_ride());
                        } else {
                            displayNoInternetConnectionDialog();
                        }
                    } else {
                        for (Seat seat : offeredRide.getListOfSeats()){
                            if(seat.getUser().getId_user() == user.getId_user()){
                                Log.d(TAG, "TAKE/LEAVE onClick: User already has a Seat in this OfferedRide - removing seat started");
                                if(isNetworkAvailable()){
                                    deleteSeat(seat.getId_seat());
                                } else {
                                    displayNoInternetConnectionDialog();
                                }
                                return;
                            }
                        }
                        Log.d(TAG, "TAKE/LEAVE onClick: List of Seats of this OfferedRide is not null but user has not Seat in this OfferedRide - adding seat started");
                        if(isNetworkAvailable()){
                            createSeat(offeredRide.getId_offered_ride());
                        } else {
                            displayNoInternetConnectionDialog();
                        }
                    }
                }
            });
        }
    }

**OnBindViewHolder **

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.driver.setText(listOfOfferedRides.get(position).getUser().getUser_name());
        holder.from_where.setText(listOfOfferedRides.get(position).getFrom_where());
        holder.to_where.setText(listOfOfferedRides.get(position).getTo_where());
        int length = listOfOfferedRides.get(position).getTime_of_ride().toString().length();
        String time = listOfOfferedRides.get(position).getTime_of_ride().toString().substring(0, length-3);
        holder.time.setText(time);
        holder.date.setText(DateFormat.getDateInstance().format(listOfOfferedRides.get(position).getDate_of_ride().getTime()));
        int numberOfFreeSeats = listOfOfferedRides.get(position).getNumber_of_free_seats();
        if(numberOfFreeSeats == 0 || numberOfFreeSeats >= 5){
            holder.numberOfFreeSeats.setText(numberOfFreeSeats + " wolnych miejsc");
        } else if (numberOfFreeSeats == 1){
            holder.numberOfFreeSeats.setText(numberOfFreeSeats + " wolne miejsce");
        } else {
            holder.numberOfFreeSeats.setText(numberOfFreeSeats + " wolne miejsca");
        }
        holder.driver_phoneNumber.setText(listOfOfferedRides.get(position).getUser().getUser_phone_number());
        holder.driver_car.setText(listOfOfferedRides.get(position).getUser().getUser_car());
        holder.driver_description.setText(listOfOfferedRides.get(position).getUser_comment());

        boolean isExpanded = listOfOfferedRides.get(position).isExpanded();
        holder.expandableLayout.setVisibility(isExpanded ? View.VISIBLE : View.GONE);

        Log.d(TAG, "TAKE/LEAVE onBindViewHolder: Set Take/Leave Seat Button");
        if(listOfOfferedRides.get(position).getListOfSeats() != null){
            for (Seat seat : listOfOfferedRides.get(position).getListOfSeats()){
                if(seat.getUser().getId_user() == user.getId_user()){
                    Log.d(TAG, "TAKE/LEAVE onBindViewHolder: This user has Seat already");
                    holder.offeredRide_seatAlreadyTakenIcon.setVisibility(View.VISIBLE);
                    holder.offeredRideRecView_takeSeatButton.setText("ZWOLNIJ MIEJSCE");
                } else {
                    Log.d(TAG, "TAKE/LEAVE onBindViewHolder: This user doesnt have Seat in this OfferedRide");
                    holder.offeredRide_seatAlreadyTakenIcon.setVisibility(View.INVISIBLE);
                    holder.offeredRideRecView_takeSeatButton.setText("ZAJMIJ MIEJSCE");
                }
            }
        } else {
            Log.d(TAG, "TAKE/LEAVE onBindViewHolder: listOfOfferedRide is null. User cannot has Seat in this OfferedRide");
            holder.offeredRide_seatAlreadyTakenIcon.setVisibility(View.INVISIBLE);
            holder.offeredRideRecView_takeSeatButton.setText("ZAJMIJ MIEJSCE");
        }
    }
2020-11-27 16:04:49.034 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onClick: Button TAKE/LEAVE has been clicked
2020-11-27 16:04:49.034 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onClick: User already has a Seat in this OfferedRide - removing seat started
2020-11-27 16:04:49.036 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: deleteSeat: method started
2020-11-27 16:04:49.036 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: deleteSeat: deleting seat with ID = 280
2020-11-27 16:04:49.292 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: deleteSeat - onResponse: method started
2020-11-27 16:04:49.292 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: deleteSeat - onResponse: responseSuccessful = true
2020-11-27 16:04:49.292 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: onLeaveSeatBtnClick: started interface - deleting account process
2020-11-27 16:04:49.292 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: onLeaveSeatBtnClick: getAdapterPosition = 0
2020-11-27 16:04:49.309 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onBindViewHolder: Set Take/Leave Seat Button
2020-11-27 16:04:51.442 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onBindViewHolder: Set Take/Leave Seat Button
2020-11-27 16:04:52.409 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onBindViewHolder: Set Take/Leave Seat Button
2020-11-27 16:04:54.970 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onClick: Button TAKE/LEAVE has been clicked
2020-11-27 16:04:54.970 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: TAKE/LEAVE onClick: List of Seats of this OfferedRide is not null but user has not Seat in this OfferedRide - adding seat started
2020-11-27 16:04:54.971 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: createSeat: method started
2020-11-27 16:04:54.978 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: createSeat: jsonWithData = {"id_seat" : 0, "id_offered_ride" : 88, "id_user" : 9 }
2020-11-27 16:04:55.156 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: createAccount -> onResponse: method started
2020-11-27 16:04:55.170 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: onResponse: Seat created successfuly
2020-11-27 16:04:55.170 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: onTakeSeatBtnClick: started interface - creating passenger process
2020-11-27 16:04:55.170 30146-30146/borgwarner.com.pickmeup D/myLogs offeRidesRecView: onTakeSeatBtnClick: getAdapterPosition = -1

title

0

Kurde. Sniło mi się, że mi ktoś odpisał, wstaje, a tu nikogo dalej :D

Pomocy Panowie, bo nie wiem, czy to jakiś mały bug, czy trzeba całą koncepcję zmieniać :p

0

Oki. Rozwiązałem problem

Rada dla przyszłych, jeśli getAdapterPosition zaczyna wariować w jakiś momentach modyfikacji itemu, to zamiast pobierać go z viewholdera za każdym razem, zacznij przekazywać go sobie jako parametr. Działa bez zarzutu

1 użytkowników online, w tym zalogowanych: 0, gości: 1