0

I have created a bus seat layout using RecyclerView through GridLayoutManager. when the view is inflated for the first time, seat arrangement view, only visible adapter positions are shown, but when the view is inflated for next time in same session,false seat layout view,all the adapter position gets visible. what should be done to eradicate this error?

Insane Developer
  • 1,014
  • 10
  • 19

1 Answers1

0
//This is the seat selection activity

package com.anbocas.fleet;

import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.StringTokenizer;

import static com.anbocas.fleet.SeatAdapter.*;

public class SeatSelectionActivity extends AppCompatActivity {

    ArrayList<Integer> items = new ArrayList<>(); // contains values 0 for hidden seat and 1 for visible seats
    ArrayList<BusSeatDataProvider> dataProvider = new ArrayList<>();
    ArrayList<Integer> seatNos = new ArrayList<>(); // this is not used
    static int hidePos = 3;
    int item = 1;
    final int TOTAL_SEATS = 50;
    RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    GridLayoutManager gridLayoutManager;
    Bitmap seatIcon;
    ArrayList<Integer> seatsJSONed = new ArrayList<>(); // contain booked seats available in database
    ArrayList<Integer> seatsPosJSONed = new ArrayList<>(); // contains the adapter position of the booked seats
    private TextView seatSelected;
    private TextView Totalfare;
    SeatAdapter seat;
    Button MakePayment;
    // ArrayList<String> seat_select = new ArrayList<>();
    String seatsFetched = "";
    static String seats = "";
    static String seatsPos="";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seat_selection);
        seatsFetched = getIntent().getStringExtra("seatsFetchedJSON");// JSON of seats and adapter position
        seatIcon = BitmapFactory.decodeResource(this.getResources(), R.drawable.seat_available_24dp);

        seatSelected = (TextView) findViewById(R.id.tv_seatSelected);
        Totalfare = (TextView) findViewById(R.id.tv_totalFare);
        MakePayment = (Button) findViewById(R.id.btn_makePayment);
        recyclerView = (RecyclerView) findViewById(R.id.seatRecycler);
        recyclerView.setHasFixedSize(true);
        gridLayoutManager = new GridLayoutManager(this, 5);
        recyclerView.setLayoutManager(gridLayoutManager);

        //---------------------------------------------------------------
        JSONObject jsonObject;
        //Log.e("seatsFetched",seatsFetched);
        Toast.makeText(this, seatsFetched, Toast.LENGTH_LONG).show();
        try {

            jsonObject = new JSONObject(seatsFetched);

            JSONArray jsonArray = jsonObject.getJSONArray("seatsFetched");

            JSONObject final_object;
            for (int i = 0; i < jsonArray.length(); i++) {
                final_object = jsonArray.getJSONObject(i);
                seats = final_object.getString("seats"); //booked seats extracted from json
                seatsPos=final_object.getString("seatPos");// adapter position extracted from json
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }

        StringTokenizer st = new StringTokenizer(seats,",");
        StringTokenizer st1=new StringTokenizer(seatsPos,",");
       int i;
        while (st.hasMoreTokens()) {
            String seat=st.nextToken();
            seatsJSONed.add(Integer.parseInt(seat));// extracting & adding individual seats to integer arraylist
        }
        while (st1.hasMoreTokens()) {
            String seatP=st1.nextToken();
            seatsPosJSONed.add(Integer.parseInt(seatP));// extracting and adding individual adapter position to integer arraylist
        }

        //-----------------------------------------------------------


        for (i = 1; i <=TOTAL_SEATS; i++) {
            if (i == hidePos && hidePos <= 43) {

                items.add(0);
                //item--;
                hidePos = hidePos + 5;
                seatNos.add(null);
                Log.e("itemValueWhereHide", item + "-" + i);
                dataProvider.add(new BusSeatDataProvider(null, null, false));
                adapter.notifyDataSetChanged();
            } else if (i == 48) {
                items.add(1);
                seatNos.add(item);
                Log.e("itemValue", (item) + "-" + i);
                dataProvider.add(new BusSeatDataProvider(seatIcon, item + "", false));
                adapter.notifyDataSetChanged();

            } else if (i == 49) {
                items.add(1);
                item = item + 1;
                seatNos.add(item);
                Log.e("itemValue", (item) + "-" + i);
                dataProvider.add(new BusSeatDataProvider(seatIcon, item + "", false));
                adapter.notifyDataSetChanged();
            } else if (i == 50) {
                items.add(1);
                item = item + 1;
                seatNos.add(item);
                Log.e("itemValue", (item) + "-" + i);
                dataProvider.add(new BusSeatDataProvider(seatIcon, item + "", false));
                adapter.notifyDataSetChanged();
            } else {
                items.add(1);
                seatNos.add(item);
                Log.e("itemValue", item + "-" + i);
                dataProvider.add(new BusSeatDataProvider(seatIcon, item + "", false));
                adapter.notifyDataSetChanged();
                item++;

            }
        }
        adapter = new SeatAdapter(dataProvider, items, seatNos, this, seatSelected, Totalfare,seatsJSONed,seatsPosJSONed);
        recyclerView.setAdapter(adapter);


    }

    public void onProceedClick(View view) {
        seat = new SeatAdapter();
        Intent intent = new Intent(this, PassengerDetailsActivity.class);
        Log.e("NumOfSeatsBooked", seat.seatCounter + "");
        intent.putExtra("NumOfSeatsBooked", seat.seatCounter);
        Log.e("seats", seatSelected.getText().toString());
        intent.putExtra("seatsSelected", seatSelected.getText().toString());
        Toast.makeText(this,seat.seat_position,Toast.LENGTH_SHORT).show();
        intent.putExtra("seatsSelectedPosition", seat.seat_position);
        // tokenize this seats string and send to passengerdetails activity to link each seat with the passenger
        startActivity(intent);
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        adapter.notifyDataSetChanged();
    }
}


// This is Seat Adapter
package com.anbocas.fleet;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Rahul Gupta on 06/09/2016.
 */
public class SeatAdapter extends RecyclerView.Adapter<SeatAdapter.ViewHolder> {

    ArrayList<BusSeatDataProvider> arrayList = new ArrayList<BusSeatDataProvider>();
    ArrayList<Integer> seatNos = new ArrayList<Integer>();
    ArrayList<Integer> items = new ArrayList<>();
    ArrayList<String> seat_select = new ArrayList<>();
    static ArrayList<String> seat_pos = new ArrayList<>();
    static String seat_position;
    BusSeatDataProvider dataProvider;
    BusSeatDataProvider dataProvider1;
    BusSeatDataProvider item;
    Context context;
    LinearLayout singleSeat;
    Bitmap seatIcon;
    Bitmap seatSelect, seatUnav;
    int fare = 0;
    static int count=0;
    static int seatCounter = 0;
    SeatSelectionActivity ob;
    String seats = "";
    TextView seatSelected, Totalfare;
    ArrayList<Integer> seatsJSONed= new ArrayList<>();
    ArrayList<Integer> seatsPosJSONed= new ArrayList<>();

    public SeatAdapter(ArrayList<BusSeatDataProvider> arrayList, ArrayList<Integer> items, ArrayList<Integer> seatNos, Context context,
                       TextView seatSelected, TextView Totalfare, ArrayList<Integer> seatsJSONed, ArrayList<Integer> seatsPosJSONed) {
        this.arrayList = arrayList;
        this.context = context;
        this.items = items;
        this.seatNos = seatNos;
        this.seatSelected = seatSelected;
        this.Totalfare = Totalfare;
        seatUnav = BitmapFactory.decodeResource(context.getResources(), R.drawable.seat_unavailable_24dp);
        seatIcon = BitmapFactory.decodeResource(context.getResources(), R.drawable.seat_available_24dp);
        seatSelect = BitmapFactory.decodeResource(context.getResources(), R.drawable.seat_selected_24dp);
        //ob=new SeatSelectionActivity();
        this.seatsJSONed = seatsJSONed;
        this.seatsPosJSONed = seatsPosJSONed;
    }

    public SeatAdapter() {
//
    }

    @Override
    public SeatAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_view_single, parent, false);
        final ViewHolder viewHolder = new ViewHolder(v);
        singleSeat=(LinearLayout)v.findViewById(R.id.single_seat_layout);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(final SeatAdapter.ViewHolder holder, final int position) {
        holder.setIsRecyclable(false);
        //-----------------------------------------------------------
        if (items.get(position) == 0) {
            dataProvider = arrayList.get(position);
            //holder.seatIcon.setImageBitmap(dataProvider.getSeatIcon());
            //holder.seatNo.setText(dataProvider.getSeatNo());
            holder.seatIconn.setVisibility(View.INVISIBLE);
            holder.seatNo.setVisibility(View.INVISIBLE);
            holder.seatIconn.setClickable(false);
            holder.seatNo.setClickable(false);
        } else {
            dataProvider = arrayList.get(position);
            holder.seatIconn.setImageBitmap(dataProvider.getSeatIcon());
            holder.seatNo.setText(dataProvider.getSeatNo());
            if(count<seatsJSONed.size())

            {
                for (int i = 0; i < seatsJSONed.size(); i++) {

                    count++;
                    int p = seatsPosJSONed.get(i);
                    System.out.println(seatsJSONed.get(i));
                    System.out.println(seatsPosJSONed.get(i));
                    arrayList.set(p, new BusSeatDataProvider(seatUnav,seatsJSONed.get(i)+"", true));
                    holder.seatIconn.setClickable(false);
                    holder.seatNo.setClickable(false);
                    holder.seatIconn.setEnabled(false);
                    holder.seatIconn.setFocusable(false);
                    singleSeat.setClickable(false);
                }
            }


            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    if (items.get(position) == 1) {
                        item = arrayList.get(position);
                    }

                    Bitmap seatcompare = item.getSeatIcon();
                    boolean seatCompareResult;//=seatCompareResult(seatcompare,seatIcon);
                    seatCompareResult = seatcompare.sameAs(seatIcon);
                    if (seatCompareResult == true) {
//                        Log.e("beforeMethod", "true");
                        seatSelected(position);
//                        Log.e("AfterMethod", "true");
                    } else {
//                        Log.e("beforeMethod", "true");
                        seatDeselected(position);
//                        Log.e("AfterMethod", "true");

                    }
                }


                public void seatSelected(int pos) {
                    if (items.get(pos) == 1) {
                        dataProvider1 = arrayList.get(pos);
                    }
                    if (seatCounter < 6) {
                        arrayList.remove(pos);
                        int i = pos;
                        seatCounter++;
//                        Log.e("SeatSelect", "true");
//                    Log.e("BeforeNotify", "true");
//                        Log.e("seatCounter", seatCounter + "");
                        arrayList.add(i, new BusSeatDataProvider(seatSelect, dataProvider1.getSeatNo(), true));
                        notifyDataSetChanged();
//                        Log.e("AfterNotify", "true");
                        //seats = seats + "" + (i) + ",";
                        seat_select.add(dataProvider1.getSeatNo());
                        //add positions to arraylist for the seat selected
                        seat_pos.add(pos + "");
                        seats = TextUtils.join(",", seat_select).toString();
                        //concatenate the selected seat position to form a string
                        seat_position = TextUtils.join(",", seat_pos).toString();
                        Toast.makeText(context, seat_position, Toast.LENGTH_SHORT).show();
                        seatSelected.setText(seats);
                        fare = fare + 330;
                        Totalfare.setText(String.valueOf(fare));
                    } else {
                        Toast.makeText(context, "Can't book more than 6 seats at a time!", Toast.LENGTH_SHORT).show();
                    }
                }

                public void seatDeselected(int pos) {
                    if (items.get(pos) == 1) {
                        dataProvider1 = arrayList.get(pos);
                    }
                    arrayList.remove(pos);
                    seat_select.remove(dataProvider1.getSeatNo());
                    seat_pos.remove(pos + "");
                    int i = pos;
                    seatCounter--;
//                    Log.e("SeatDeSelect", "true");
//                    Log.e("BeforeNotify", "true");
//                    Log.e("seatCounter", seatCounter + "");
                    arrayList.add(i, new BusSeatDataProvider(seatIcon, dataProvider1.getSeatNo(), false));
                    notifyDataSetChanged();
//                    Log.e("AfterNotify", "true");
                    seats = TextUtils.join(",", seat_select).toString();
                    seat_position = TextUtils.join(",", seat_pos).toString();
                    Toast.makeText(context, seat_position, Toast.LENGTH_SHORT).show();
//                    seats = seats.replace("" + dataProvider1.getSeatNo() + ",", "");
                    fare = fare - 330;
                    Totalfare.setText(fare + "");
                    seatSelected.setText(seats);

                }
            });
        }
    }

//     boolean seatCompareResult(Bitmap seatcompare, Bitmap seatIcon) {
//
//        {
//            if (seatcompare.getHeight() != seatIcon.getHeight())
//                return false;
//            if (seatcompare.getWidth() != seatIcon.getWidth()) return false;
//
//            for (int y = 0; y < seatcompare.getHeight(); ++y)
//                for (int x = 0; x < seatcompare.getWidth(); ++x)
//                    if (seatcompare.getPixel(x, y) != seatIcon.getPixel(x, y)) return false;
//
//            return true;
//        }
//    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        ImageView seatIconn;
        TextView seatNo;

        public ViewHolder() {
            super(null);

        }

        public ViewHolder(final View itemView) {
            super(itemView);
            seatIconn = (ImageView) itemView.findViewById(R.id.seatIcon);
            seatNo = (TextView) itemView.findViewById(R.id.seatNo);

        }


    }


}
Insane Developer
  • 1,014
  • 10
  • 19