网络资源模板--基于Android Studio 实现的运动场馆预约

目录

一、测试环境说明

二、项目简介

三、项目演示

四、部设计详情(部分))

首页

五、项目源码


一、测试环境说明

电脑环境

Windows 11

编写语言

JAVA

开发软件

Android Studio (2020)

开发软件只要大于等于测试版本即可(近几年官网直接下载也可以),若是版本低于测试版本请自行测试。项目需要根据你的软件自行适配

二、项目简介

该项目简介来自网络,具体内容需要自行测试

校运汇体育场地预约系统是一款基于Android平台的移动应用,旨在为校园师生提供便捷的体育场地预约服务。

该系统采用Java语言开发,使用SQLite作为本地数据库存储用户信息和场地预约数据。系统主要功能包括用户注册登录、场地查询预约、个人预约管理以及账户设置等模块。

用户可以通过直观的界面浏览不同日期和类型的体育场地,查看场地预约状态并进行预约操作。系统实现了用户身份验证、场地状态实时更新、预约记录管理等功能,并通过底部导航栏提供流畅的页面切换体验。

在技术实现上,系统采用了MVC架构模式,使用Android原生组件和Material Design设计规范,确保应用的稳定性和良好的用户体验。

该系统有效解决了传统人工预约方式的效率低下问题,为校园体育资源管理提供了数字化解决方案。

该项目由编程乐学团队介入,优化布局完善功能

三、项目演示

网络资源模板--基于Android studio 运动场馆预约

四、部设计详情(部分)

首页

  1. 页面的结构

该页面采用经典的垂直线性布局,顶部包含两个文本视图用于显示用户选择的运动场地和预约日期,中间有一个复选框用于筛选未被预约的场地,底部是一个搜索按钮。

页面主体部分是一个列表视图,用于展示筛选后的场地信息。当没有可选场地时,会显示一个提示文本。

整体布局层次清晰,功能分区明确,用户操作流程从选择条件到查看结果自然流畅。

  1. 使用到的技术

该页面使用了Android的基础UI组件和数据库技术。布局采用XML定义,通过数据绑定将SQLite数据库中的场地信息展示在列表视图中。

使用了SimpleCursorAdapter作为数据适配器,实现了数据库查询结果的动态展示。页面交互方面采用了活动跳转、对话框提示和Toast通知等技术。

数据筛选功能通过组合SQL查询条件实现,体现了Android基础开发技术的综合应用。

  1. 页面详细介绍

这是一个运动场地预约系统的首页面,用户可以通过选择场地类型和预约日期来筛选可用场地。页面提供"只看未被预约"的筛选选项,方便用户快速找到可预约资源。

点击筛选按钮后,系统会根据条件查询数据库并实时更新列表显示。每个场地项都包含预约按钮,用户可以直接点击预约,系统会通过对话框确认操作。

页面设计简洁直观,充分考虑了用户预约场地的核心需求和使用场景。

java 复制代码
package com.example.SportApp.Home;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import com.example.SportApp.MainActivity;
import com.example.SportApp.MyDatabaseHelper;
import com.example.SportApp.R;

public class HomeFragment extends Fragment {

    private MyDatabaseHelper databaseHelper;
    private String filed_date; // 选择的日期
    private String field_name; // 选择的场地
    private int current_user_id; // 当前用户
    private SimpleCursorAdapter adapter;
    private ListView field_listview;
    private SQLiteDatabase db;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_home, container, false);
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        current_user_id = ((MainActivity) context).getCurrentUser();
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        // 初始化数据库
        databaseHelper = new MyDatabaseHelper(getContext(), "SportDatabase.db", null, 1);
        db = databaseHelper.getWritableDatabase();

        // 初始化视图
        field_listview = view.findViewById(R.id.field_listview);
        TextView date_text = view.findViewById(R.id.date_text);
        TextView field_text = view.findViewById(R.id.field_text);
        CheckBox reserved_checkbox = view.findViewById(R.id.reserved_checkbox);
        Button search_button = view.findViewById(R.id.search_button);

        // 设置初始适配器(显示所有场地)
        refreshListView(null, null, false);

        // 日期选择点击事件
        date_text.setOnClickListener(v ->
                startActivityForResult(new Intent(getActivity(), SelectDate.class), 1));

        // 场地选择点击事件
        field_text.setOnClickListener(v ->
                startActivityForResult(new Intent(getActivity(), SelectField.class), 2));

        // 筛选按钮点击事件
        search_button.setOnClickListener(v -> {
            boolean onlyAvailable = reserved_checkbox.isChecked();
            refreshListView(filed_date, field_name, onlyAvailable);
        });

        // 列表项点击事件
        field_listview.setOnItemClickListener((parent, view1, position, id) -> {
            Cursor cursor = (Cursor) adapter.getItem(position);
            handleReservation(cursor);
        });
    }

    // 刷新列表视图
    private void refreshListView(String date, String name, boolean onlyAvailable) {
        String query;
        if (date == null && name == null) {
            query = "SELECT * FROM field";
        } else {
            query = "SELECT * FROM field WHERE date = '" + date +
                    "' AND field_name = '" + name + "'";
            if (onlyAvailable) {
                query += " AND reserved = '未被预约'";
            }
        }

        Cursor cursor = db.rawQuery(query, null);

        adapter = new SimpleCursorAdapter(
                getContext(),
                R.layout.reservation_item,
                cursor,
                new String[]{"_id", "field_name", "date", "time", "reserved"},
                new int[]{R.id.field_id, R.id.field_name, R.id.date, R.id.time, R.id.reserved},
                0
        ) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View view = super.getView(position, convertView, parent);

                // 设置预约按钮点击事件
                Button reserveButton = view.findViewById(R.id.reserve_button);
                reserveButton.setOnClickListener(v -> {
                    Cursor cursor = (Cursor) getItem(position);
                    handleReservation(cursor);
                });

                return view;
            }
        };

        field_listview.setAdapter(adapter);
    }

    // 处理预约逻辑
    private void handleReservation(Cursor cursor) {
        int field_id = cursor.getInt(cursor.getColumnIndex("_id"));
        String reserved = cursor.getString(cursor.getColumnIndex("reserved"));

        if (reserved.equals("未被预约")) {
            new AlertDialog.Builder(getContext())
                    .setTitle("是否确认预约")
                    .setPositiveButton("确定", (dialog, which) -> {
                        db.execSQL("UPDATE field SET user_id = '" + current_user_id +
                                "', reserved = '已被预约' WHERE _id = " + field_id);
                        Toast.makeText(getContext(), "预约成功", Toast.LENGTH_SHORT).show();
                        refreshListView(filed_date, field_name, false);
                    })
                    .setNegativeButton("取消", null)
                    .show();
        } else {
            Toast.makeText(getContext(), "该场地已被预约", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (data == null) return;

        Bundle bundle = data.getExtras();
        if (bundle == null) return;

        switch (requestCode) {
            case 1: // 日期选择返回
                filed_date = bundle.getString("date_data");
                TextView dateTextView = getView().findViewById(R.id.date_text);
                dateTextView.setText(filed_date);
                break;
            case 2: // 场地选择返回
                field_name = bundle.getString("field_data");
                TextView fieldTextView = getView().findViewById(R.id.field_text);
                fieldTextView.setText(field_name);
                break;
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (db != null) {
            db.close();
        }
    }
}

五、项目源码

👇👇👇👇👇快捷方式👇👇👇👇👇

相关推荐
Kapaseker4 小时前
你不看会后悔的2025年终总结
android·kotlin
alexhilton7 小时前
务实的模块化:连接模块(wiring modules)的妙用
android·kotlin·android jetpack
ji_shuke8 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
sunnyday04269 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理11 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台11 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐11 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
白熊小北极11 小时前
Android Jetpack Compose折叠屏感知与适配
android
HelloBan11 小时前
setHintTextColor不生效
android
洞窝技术13 小时前
从0到30+:智能家居配网协议融合的实战与思考
android