You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:34:38