当前位置: 首页 > 知识库问答 >
问题:

公交座位预订选择和取消选择有位置的问题

邓才
2023-03-14

我正在开发一个巴士预订应用程序。我使用Recyclerview和GridLayoutManager创建了座位预订布局。布局已正确创建。我1排有4个座位,最后一排有5个座位。所以我在GridLayoutManager中使用了5个列。中间立柱空出两个座位之间的空间供步行。现在的问题是,如果我点击第1个座位,将选择第1个座位,但图像变化的第5个座位。并且我还在textview中设置了座位号,所以有时显示正确的座位号,有时显示空白或有时显示错误。

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个答案

微生城
2023-03-14

您的代码有多个问题,应该进行修复和改进

请查看以下代码以选择座位:

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],您将在位置=3处添加项目。

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函数执行相同的操作,并将循环更改为(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
                }
            }
        });
 类似资料:
  • 我试图找到/创建一个位旋转算法,该算法在-bit-count位掩码中生成s的所有

  • 我很难理解Django ORM中的和。我有以下型号: 现在我的views.py: 但是现在,每次for循环迭代时,它都会访问数据库3次。我试图提高时间复杂度——现在是3N 2,N是城市的数量,但是我不能理解select_related和prefetch_related。 你能给我一个例子,我该如何改进它,使它不会在for循环中命中数据库3次吗?

  • 不幸的是,再也不可能这样做了,这里描述:如何选择Google App Engine服务器的位置 当我创建一个新项目时,没有“高级”设置。如果我仍然只是“盲目”部署(在忽略了令人讨厌的新教程/强行进入喉咙的快速启动后),它将使用欧洲-西方作为地区。

  • 问题内容: 我有2个具有相同主键的表(A和B)。我想选择A中而不是B中的所有行。 但是,这似乎很糟糕(A中只有10万行,而B中只有3-10k的行大约2秒) 有更好的方法来运行此吗?也许是左派? 根据我的数据,运行速度似乎稍快(〜10%),但是总体上呢? 问题答案: 我以第二个示例的格式使用查询。联接通常比相关子查询更具可伸缩性。

  • 问题内容: 有没有一种方法可以针对具有指向ArrayList或List的where子句的数据源(可以是sql,oracle或access)创建查询? 例子: 我已经看到了使用Linq的一些方法,但是如果可以避免的话,我宁愿不诉诸于此。 问题答案: 您可以使用。尝试这样的事情: 附带说明,这不能保护您免受SQL注入的侵害-希望本示例将为您指明正确的方向。

  • 问题内容: 我的CSS定位器有问题。我为父母有一个独特的标签,从那里我可以得到所需的孩子。 该类与所有下拉列表相似,因此唯一会改变的值是。另外,有时我需要取消选择它们。 为此,我有一个定位器。 如您所见,第一部分仍然相同。 所以我的问题是是否有可能编写一些方法(或任何其他方式)来更改定位器的最后一部分?我有600多个下拉菜单,并且为600个新定位器创建了一个目标,这使我发疯。 对我来说,执行类似操