В вашем коде есть несколько проблем, которые нужно исправить и улучшить
Давайте рассмотрим этот код для выбора места:
public void seatSelected(int pos)
{
charge = charge + amt;
imageView.setImageBitmap(seatSelect);
txtSeatNo.setText(seatDetailsList.get(pos).getName());
fare.setText(String.valueOf(charge));
seatDetailsList.remove(pos);
seatDetailsList.add(pos, new SeatDetails(seatDetailsList.get(pos).getName(), true, true));
seatAdapter.notifyDataSetChanged();
}
Предположим, ваш список [0, 1, 2, 3, 4]
, и вы собираетесь добавить элемент на pos = 3
.
Сначала вы звоните: seatDetailsList.remove(pos);
-> Ваш список становится [0, 1, 2, 4]
.
Тогда вы звоните
seatDetailsList.add(pos, new SeatDetails(seatDetailsList.get(pos).getName(), true, true));
В этом вызове метода вы получаете seatDetailsList.get(pos).getName()
из списка, текущие элементы pos = 3
в списке 4
, и в итоге вы добавляете место с номером 4
в список следующим образом:
[0, 1, 2, 4, 4]
не [0, 1, 2, 3, 4]
, как вы ожидали.
Тогда представьте, что вы выбираете последнее место в списке. Если вы удалите последний индекс (4
), то при получении доступа к seatDetailsList.get(pos)
возникнет исключение, поскольку вы обращаетесь к памяти вне списка (ArrayOutOfBoundIndexException
).
Так что вы можете это исправить, просто изменив текущее состояние сиденья, вместо того, чтобы удалять и повторно добавлять их.
Попробуйте это:
public void seatSelected(int pos)
{
charge = charge + amt;
imageView.setImageBitmap(seatSelect);
txtSeatNo.setText(seatDetailsList.get(pos).getName());
fare.setText(String.valueOf(charge));
//seatDetailsList.remove(pos);
//seatDetailsList.add(pos, new SeatDetails(seatDetailsList.get(pos).getName(), true, true));
seatDetailList.get(pos).setIsSelected(true);
seatAdapter.notifyDataSetChanged();
}
Попробуйте сделать то же самое с функцией seatDeselected
и измените цикл на for (int i = 0; i < 60; i++)
Редактировать
class ViewHolderOriginal extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView; // Add this as internal property
ViewHolderOriginal(View itemView) {
super(itemView);
imageView= (ImageView) itemView.findViewById(R.id.item_image);
textView = (TextView) itemView.findViewById(R.id.item_text);
}
}
А в вашем слушателе:
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SeatDetails seatDetails = seatDetailsList.get(position);
if (seatDetails.isSelected){
seatDeselected(position);
holder.getImageView().setImageBitmap(seatSelect); // Modify state
}
else
{
seatSelected(position);
holder.getImageView().setImageBitmap(seatSelect); // Modify state
}
}
});