我正在开发一个巴士预订应用程序。我使用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);
}
}
});
}
}
}
}
您的代码有多个问题,应该进行修复和改进
请查看以下代码以选择座位:
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个新定位器创建了一个目标,这使我发疯。 对我来说,执行类似操