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