I am working on a bus booking app. I created seat booking layout using Recyclerview and GridLayoutManager. Layout created properly. I have 4 seats in 1 row and 5 seats in the last row. So I used 5 column in GridLayoutManager. And middle column will be empty for space between 2 seats for walking. Now the problem is if I clicked on the 1st seat in will select 1s seat but image change of 5th seat. And I also set seat no in textview, so sometimes it shows correct seat no., sometimes it shows blank or sometimes wrong.
SeatSelection Activity
public class SeatSelection extends AppCompatActivity implements AdapterView.OnItemClickListener{
RecyclerView recyclerView;
SeatAdapter seatAdapter;
List<SeatDetails> seatDetailsList;
TextView txtSeatNo;
ImageView imageView;
TextView fare;
public Bitmap seatIcon;
public Bitmap seatSelect;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seat_selection);
seatIcon = BitmapFactory.decodeResource(this.getResources(), R.drawable.seat_layout_screen_nor_avl);
seatSelect = BitmapFactory.decodeResource(this.getResources(), R.drawable.seat_layout_screen_nor_std);
recyclerView = (RecyclerView) findViewById(R.id.recycler);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(this, 5);
recyclerView.setLayoutManager(layoutManager);
seatAdapter = new SeatAdapter(this, loadBustListSeats());
recyclerView.setAdapter(seatAdapter);
}
public class SeatDetails {
String name;
boolean isBlank;
boolean isSelected;
public SeatDetails(String name, boolean isBlank, boolean isSelected)
{
this.name = name;
this.isBlank = isBlank;
this.isSelected = isSelected;
}
public String getName() {
return name;
}
}
public List<SeatDetails> loadBustListSeats() {
seatDetailsList = new ArrayList<SeatDetails>();
int seatSerialNumber = 1;
for (int i = 0; i <= 60; i++) {
if (isBlankSeat(i)) {
seatDetailsList.add(new SeatDetails("", true, false));
} else {
if (i == 0) {
seatDetailsList.add(new SeatDetails("A", true, false));
} else if (i == 1) {
seatDetailsList.add(new SeatDetails("B", true, false));
} else {
seatDetailsList.add(new SeatDetails(String.valueOf(seatSerialNumber), true, false));
seatSerialNumber = seatSerialNumber + 1;
}
}
}
return seatDetailsList;
}
public boolean isBlankSeat(int i) {
if ((60 - (i - 1)) < 5)
return false;
else
return i % 5 == 2 ;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
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();
}
public void seatDeselected(int pos)
{
charge = charge - amt;
imageView.setImageBitmap(seatIcon);
fare.setText(String.valueOf(charge));
seatDetailsList.remove(pos);
seatDetailsList.add(pos, new SeatDetails(seatDetailsList.get(pos).getName(), true, false));
seatAdapter.notifyDataSetChanged();
}
public class SeatAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
class ViewHolderOriginal extends RecyclerView.ViewHolder{
TextView textView;
ViewHolderOriginal(View itemView) {
super(itemView);
imageView= (ImageView) itemView.findViewById(R.id.item_image);
textView = (TextView) itemView.findViewById(R.id.item_text);
}
}
class ViewHolderBlank extends RecyclerView.ViewHolder{
ViewHolderBlank(View itemView) {
super(itemView);
}
}
private Context cntx;
public SeatAdapter(Context context, List<SeatDetails> list){
cntx = context;
seatDetailsList = list;
}
// 0= Original view 1= Blank View
@Override
public int getItemViewType(int position) {
if((getItemCount()-(position-1))<5)
return 0;
else
return position % 5 == 2 ? 1 : 0;
}
@Override
public int getItemCount() {
return 60;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (viewType == 1)
return new ViewHolderBlank(inflater.inflate(R.layout.item_blank, parent, false));
else
return new ViewHolderOriginal(inflater.inflate(R.layout.seatrow_grid, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if (holder instanceof ViewHolderBlank) {
} else if (holder instanceof ViewHolderOriginal) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SeatDetails seatDetails = seatDetailsList.get(position);
if (seatDetails.isSelected){
seatDeselected(position);
}
else
{
seatSelected(position);
}
}
});
}
}
}
}