Бронирование автобусного места Выберите и отмените выбор позиции - PullRequest
0 голосов
/ 07 мая 2018

Я работаю над приложением бронирования автобусов. Я создал схему бронирования мест с помощью Recyclerview и GridLayoutManager. Макет создан правильно. У меня 4 места в 1 ряду и 5 мест в последнем ряду. Поэтому я использовал 5 столбцов в GridLayoutManager. А средняя колонка будет пуста для места между 2 местами для прогулок. Теперь проблема в том, что если я нажму на 1-е место, выберу 1-е место, но смена изображения на 5-м месте. И я также установил номер места в текстовом просмотре, поэтому иногда он показывает правильный номер места, иногда пустой или иногда неправильный.

Это мой макет

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);

                    }
                }
            });

        }
    }

}
}

1 Ответ

0 голосов
/ 07 мая 2018

В вашем коде есть несколько проблем, которые нужно исправить и улучшить

Давайте рассмотрим этот код для выбора места:

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
                }
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...