如何用GridView或GridLayout实现选座界面?统一获取选中座位方法
解决选座界面获取所有选中座位的问题
不用拆分多个Java文件和GridView来折腾,咱们可以把两个座位网格整合到同一个Activity里,统一管理选中状态,轻松拿到所有选中的座位。下面给你一步步的实现方案:
1. 统一布局文件
把两个GridView放到同一个布局文件(比如activity_seat_select.xml)里,给它们分别设置唯一ID方便后续调用:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:padding="16dp"> <GridView android:id="@+id/gridView_left" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:numColumns="5"/> <GridView android:id="@+id/gridView_right" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:numColumns="5"/> <Button android:id="@+id/btn_get_selected" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看选中座位" android:layout_marginTop="20dp"/> </LinearLayout>
2. 通用座位适配器
写一个通用的SeatAdapter,既能处理座位的显示状态(选中/未选中/已占用),还能直接提供获取选中座位的方法:
public class SeatAdapter extends BaseAdapter { private Context mContext; private List<Seat> mSeatList; // 用SparseBooleanArray存储选中状态,比HashMap更省内存 private SparseBooleanArray mSelectedStates = new SparseBooleanArray(); public SeatAdapter(Context context, List<Seat> seatList) { mContext = context; mSeatList = seatList; } @Override public int getCount() { return mSeatList.size(); } @Override public Object getItem(int position) { return mSeatList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ImageView seatView; if (convertView == null) { seatView = new ImageView(mContext); seatView.setLayoutParams(new GridView.LayoutParams(80, 80)); seatView.setPadding(8, 8, 8, 8); } else { seatView = (ImageView) convertView; } Seat seat = mSeatList.get(position); // 根据状态设置对应图标 if (mSelectedStates.get(position)) { seatView.setImageResource(R.drawable.rect_sel); } else if (seat.isOccupied()) { seatView.setImageResource(R.drawable.rect_occupied); } else { seatView.setImageResource(R.drawable.rect_normal); } // 点击切换选中状态(已占用的座位不能选) seatView.setOnClickListener(v -> { if (!seat.isOccupied()) { mSelectedStates.put(position, !mSelectedStates.get(position)); notifyDataSetChanged(); } }); return seatView; } // 获取当前GridView里所有选中的座位 public List<Seat> getSelectedSeats() { List<Seat> selectedList = new ArrayList<>(); for (int i = 0; i < mSeatList.size(); i++) { if (mSelectedStates.get(i)) { selectedList.add(mSeatList.get(i)); } } return selectedList; } }
再补一个Seat实体类,用来存储座位的基础信息:
public class Seat { private int seatNumber; private boolean isOccupied; public Seat(int seatNumber, boolean isOccupied) { this.seatNumber = seatNumber; this.isOccupied = isOccupied; } public int getSeatNumber() { return seatNumber; } public boolean isOccupied() { return isOccupied; } }
3. 在单个Activity中统一管理
回到你的Seat_Select.java,初始化两个GridView并绑定适配器,然后就能一键获取所有选中座位了:
public class Seat_Select extends AppCompatActivity { private GridView mGridViewLeft; private GridView mGridViewRight; private SeatAdapter mLeftAdapter; private SeatAdapter mRightAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_seat_select); mGridViewLeft = findViewById(R.id.gridView_left); mGridViewRight = findViewById(R.id.gridView_right); Button getSelectedBtn = findViewById(R.id.btn_get_selected); // 模拟左侧座位数据:前3个座位已被占用 List<Seat> leftSeats = new ArrayList<>(); for (int i = 1; i <= 20; i++) { leftSeats.add(new Seat(i, i <= 3)); } mLeftAdapter = new SeatAdapter(this, leftSeats); mGridViewLeft.setAdapter(mLeftAdapter); // 模拟右侧座位数据:第25、30号座位已被占用 List<Seat> rightSeats = new ArrayList<>(); for (int i = 21; i <= 40; i++) { rightSeats.add(new Seat(i, i == 25 || i == 30)); } mRightAdapter = new SeatAdapter(this, rightSeats); mGridViewRight.setAdapter(mRightAdapter); // 点击按钮获取所有选中座位 getSelectedBtn.setOnClickListener(v -> { List<Seat> allSelected = new ArrayList<>(); allSelected.addAll(mLeftAdapter.getSelectedSeats()); allSelected.addAll(mRightAdapter.getSelectedSeats()); // 把选中的座位号拼接成字符串展示 StringBuilder seatInfo = new StringBuilder("你选中的座位:"); for (Seat seat : allSelected) { seatInfo.append(seat.getSeatNumber()).append(" "); } Toast.makeText(this, seatInfo.toString(), Toast.LENGTH_LONG).show(); }); } }
核心优势
- 用同一个适配器类处理两个GridView,减少重复代码
- 每个适配器自己维护选中状态,最后在Activity里合并结果就行
SparseBooleanArray比普通HashMap更适合存储这种布尔型的选中状态,性能更好
这样你就可以在单个Seat_Select.java文件里轻松搞定所有选中座位的获取啦!
内容的提问来源于stack exchange,提问作者rk_1
相关产品推荐
相关产品推荐

