目录
一、测试环境说明
电脑环境
Windows 11
编写语言
JAVA
开发软件
Android Studio (2020)
开发软件只要大于等于测试版本即可(近几年官网直接下载也可以),若是版本低于测试版本请自行测试。项目需要根据你的软件自行适配
二、项目简介
该项目简介来自网络,具体内容需要自行测试
校运汇体育场地预约系统是一款基于Android平台的移动应用,旨在为校园师生提供便捷的体育场地预约服务。
该系统采用Java语言开发,使用SQLite作为本地数据库存储用户信息和场地预约数据。系统主要功能包括用户注册登录、场地查询预约、个人预约管理以及账户设置等模块。
用户可以通过直观的界面浏览不同日期和类型的体育场地,查看场地预约状态并进行预约操作。系统实现了用户身份验证、场地状态实时更新、预约记录管理等功能,并通过底部导航栏提供流畅的页面切换体验。
在技术实现上,系统采用了MVC架构模式,使用Android原生组件和Material Design设计规范,确保应用的稳定性和良好的用户体验。
该系统有效解决了传统人工预约方式的效率低下问题,为校园体育资源管理提供了数字化解决方案。
该项目由编程乐学团队介入,优化布局完善功能
三、项目演示
网络资源模板--基于Android studio 运动场馆预约
四、部设计详情(部分)
首页
1. 页面的结构
该页面采用经典的垂直线性布局,顶部包含两个文本视图用于显示用户选择的运动场地和预约日期,中间有一个复选框用于筛选未被预约的场地,底部是一个搜索按钮。
页面主体部分是一个列表视图,用于展示筛选后的场地信息。当没有可选场地时,会显示一个提示文本。
整体布局层次清晰,功能分区明确,用户操作流程从选择条件到查看结果自然流畅。
2. 使用到的技术
该页面使用了Android的基础UI组件和数据库技术。布局采用XML定义,通过数据绑定将SQLite数据库中的场地信息展示在列表视图中。
使用了SimpleCursorAdapter作为数据适配器,实现了数据库查询结果的动态展示。页面交互方面采用了活动跳转、对话框提示和Toast通知等技术。
数据筛选功能通过组合SQL查询条件实现,体现了Android基础开发技术的综合应用。
3. 页面详细介绍
这是一个运动场地预约系统的首页面,用户可以通过选择场地类型和预约日期来筛选可用场地。页面提供"只看未被预约"的筛选选项,方便用户快速找到可预约资源。
点击筛选按钮后,系统会根据条件查询数据库并实时更新列表显示。每个场地项都包含预约按钮,用户可以直接点击预约,系统会通过对话框确认操作。
页面设计简洁直观,充分考虑了用户预约场地的核心需求和使用场景。
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();
}
}
}
五、项目源码
👇👇👇👇👇快捷方式👇👇👇👇👇