欢迎光临:
古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼
---------------🍎------------🍉--------------
🐼学编程的bird的博客,邀您一起学习🦌
----------------🥕------------🥭-------------😊很高兴你打开了这篇博客。
★如有疑问不解或者说有想问的地方,都可以在下方评论留言,博主看到会尽快回复的。
★当然,期待你的点赞+关注哦!★本人微信:wxid_v28nw5cckzz622,若需要帮助,请备注来源+意图
————————————————
版权声明:本文为CSDN博主「学编程的bird」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:Android Studio 大作业--学生信息管理系统-CSDN博客https://blog.csdn.net/m0_64069699/article/details/135324803
内容大概:
简易学生信息管理系统项目需求,大致需要以下Java文件和XML布局文件: Java文件: Student 类(实体类):用于存储学生信息。 StudentDBHelper 类(数据库操作类):继承自SQLiteOpenHelper,负责创建表、插入、删除、更新和查询学生数据。 StudentListAdapter 类(RecyclerView Adapter):适配器类,用于在“学生列表”模块展示学生数据。 StudentListFragment 类(Fragment):实现学生列表界面功能,包含RecyclerView及其Adapter的初始化等。 AddStudentFragment 类(Fragment):实现添加学生界面功能,包含EditText输入框、Button提交按钮、ImageView头像选择等。 SearchStudentFragment 类(Fragment):实现查询学生界面功能,包含EditText输入框、CheckBox或RadioButton查询条件选择、查询结果展示列表的初始化等。 SearchStudentListAdapter 类(RecyclerView Adapter):适配器类,用于在“搜索”模块展示学生数据。 MainActivity:用于初始化底部导航栏与ViewPager2,并管理各个Fragment。 XML布局文件: activity_main.xml:主Activity布局文件,包含ViewPager2和TabLayout等控件。 fragment_student_list.xml:学生列表Fragment的布局文件,包含RecyclerView等控件。 fragment_add_student.xml:添加学生Fragment的布局文件,包含姓名、学号、专业等EditText输入框以及上传或选择图片的ImageView和提交按钮等控件。 item_student1.xml:RecyclerView中单个学生项的布局文件,包含显示学生信息的各种TextView、ImageView等控件。 fragment_search_student.xml:查询学生Fragment的布局文件,包含查询输入框、查询条件选择控件以及查询结果展示的ListView或RecyclerView控件。 item_student2.xml:RecyclerView中单个学生项的布局文件,包含显示学生信息的各种TextView、ImageView等控件。 dialog_delete_confirm.xml:删除确认AlertDialog或PopupWindow的布局文件,包含提示文字和确认/取消按钮。 bottom_navigation_menu.xml:底部导航栏。
使用的控件:
此APP中包含以下控件: Button、TextView、EditText、ImageView、Toast、Activity 跳转和传值、ViewPager2+Fragment 底部导航 PopupWindow & AlertDialog、数据库 RadioButton、CheckBox、返回值、RecyclerView
整体架构:
示例展示:
学生列表
添加
搜索
源代码:
JAVA代码
MainActivity
package com.example.myfinalwork; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.viewpager2.widget.ViewPager2; import androidx.viewpager2.adapter.FragmentStateAdapter; import androidx.appcompat.widget.Toolbar; import android.os.Bundle; import android.view.MenuItem; import android.view.Menu; import android.widget.Toast; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.example.myfinalwork.StudentListRefreshListener; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements StudentListRefreshListener { private ViewPager2 viewPager; private BottomNavigationView bottomNavigationView; private List<Fragment> fragmentsList; private MenuItem lastSelectedMenuItem; private StudentListFragment studentListFragment; // 新增变量 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化ViewPager2和BottomNavigationView viewPager = findViewById(R.id.view_pager); setupViewPager(); // 在这里找到并保存StudentListFragment的引用 for (Fragment fragment : fragmentsList) { if (fragment instanceof StudentListFragment) { studentListFragment = (StudentListFragment) fragment; break; } } bottomNavigationView = findViewById(R.id.bottom_navigation_view); bottomNavigationView.setOnNavigationItemSelectedListener(navigationItemSelectedListener()); bottomNavigationView.setSelectedItemId(R.id.action_student_list); } @Override public void onStudentListRefresh() { if (studentListFragment != null) { studentListFragment.refreshStudentList(); } } private BottomNavigationView.OnNavigationItemSelectedListener navigationItemSelectedListener() { return new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.action_student_list) { viewPager.setCurrentItem(0); } else if (item.getItemId() == R.id.action_add_student) { viewPager.setCurrentItem(1); } else if (item.getItemId() == R.id.action_search_student) { viewPager.setCurrentItem(2); } lastSelectedMenuItem = item; return true; } }; } private void setupViewPager() { fragmentsList = new ArrayList<>(); studentListFragment = new StudentListFragment(); // 修改:直接使用类级别的变量 AddStudentFragment addStudentFragment = new AddStudentFragment(); SearchStudentFragment searchStudentFragment = new SearchStudentFragment(); // 为AddStudentFragment设置一个接口回调以通知MainActivity刷新列表 addStudentFragment.setStudentListRefreshListener(this); fragmentsList.add(studentListFragment); fragmentsList.add(addStudentFragment); fragmentsList.add(searchStudentFragment); viewPager.setAdapter(new FragmentStateAdapter(this) { @NonNull @Override public Fragment createFragment(int position) { return fragmentsList.get(position); } @Override public int getItemCount() { return fragmentsList.size(); } }); viewPager.setUserInputEnabled(false); // 可选:禁用手动滑动切换页面 } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.bottom_navigation_menu, menu); return true; } }
Student类
package com.example.myfinalwork; public class Student { private String id; private String name; private String major; private boolean selected; // 添加一个布尔变量来表示学生是否被选中 public Student(String id, String name, String major) { this.id = id; this.name = name; this.major = major; this.selected = false; // 初始化时默认未选中 } public Student() { } // Getters and Setters public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMajor() { return major; } public void setMajor(String major) { this.major = major; } // 新增isSelected()和setSelected()方法 public boolean isSelected() { return selected; } public void setSelected(boolean selected) { this.selected = selected; } @Override public String toString() { return "Student{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", major='" + major + '\'' + ", selected=" + selected + '}'; } }
StudentDBHelper类
package com.example.myfinalwork; import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import java.util.ArrayList; import java.util.List; public class StudentDBHelper extends SQLiteOpenHelper { // 数据库名称 private static final String DATABASE_NAME = "StudentManager.db"; // 数据库版本号,每次更新数据库结构时需要增加 private static final int DATABASE_VERSION = 1; // 学生信息表名 public static final String TABLE_NAME_STUDENTS = "students"; // 表列名定义 public static final String COLUMN_ID = "id"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_MAJOR = "major"; // 创建学生信息表的SQL语句 private static final String CREATE_TABLE_STUDENTS = "CREATE TABLE " + TABLE_NAME_STUDENTS + "(" + COLUMN_ID + " TEXT PRIMARY KEY," + COLUMN_NAME + " TEXT NOT NULL," + COLUMN_MAJOR + " TEXT NOT NULL" + ")"; public StudentDBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE_STUDENTS); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 在数据库版本升级时,可以在此处添加数据迁移逻辑或者删除旧表重建新表 db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME_STUDENTS); onCreate(db); } /** * 一个简单的方法用于将学生信息插入数据库,具体实现由StudentDBHelper提供 * @param student 要插入的学生对象 */ public void insertStudent(Student student) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_ID, student.getId()); values.put(COLUMN_NAME, student.getName()); values.put(COLUMN_MAJOR, student.getMajor()); db.insert(TABLE_NAME_STUDENTS, null, values); db.close(); // 关闭数据库连接 } /** * 根据查询条件搜索学生 * @param query 搜索关键词 * @param searchBy 搜索依据字段("name" 或 "id" 或 "major") * @return 匹配到的学生列表 */ public List<Student> searchStudents(String query, String searchBy) { List<Student> studentList = new ArrayList<>(); SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor; if (searchBy.equals("name")) { cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME_STUDENTS + " WHERE " + COLUMN_NAME + " LIKE ?", new String[]{"%" + query + "%"}); } else if (searchBy.equals("id")) { cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME_STUDENTS + " WHERE " + COLUMN_ID + " LIKE ?", new String[]{"%" + query + "%"}); } else if (searchBy.equals("major")) { cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME_STUDENTS + " WHERE " + COLUMN_MAJOR + " LIKE ?", new String[]{"%" + query + "%"}); } else { throw new IllegalArgumentException("Invalid searchBy field"); } if (cursor.moveToFirst()) { do { Student student = new Student(); int idColumnIndex = cursor.getColumnIndex(COLUMN_ID); int nameColumnIndex = cursor.getColumnIndex(COLUMN_NAME); int majorColumnIndex = cursor.getColumnIndex(COLUMN_MAJOR); if (idColumnIndex >= 0) { student.setId(cursor.getString(idColumnIndex)); } if (nameColumnIndex >= 0) { student.setName(cursor.getString(nameColumnIndex)); } if (majorColumnIndex >= 0) { student.setMajor(cursor.getString(majorColumnIndex)); } // 只有当所有必要的字段都获取成功时才添加到列表 if (student.getId() != null && student.getName() != null && student.getMajor() != null) { studentList.add(student); } } while (cursor.moveToNext()); } cursor.close(); db.close(); return studentList; } /** * 获取所有学生信息 * @return 所有的学生列表 */ @SuppressLint("Range") public List<Student> getAllStudents() { List<Student> studentList = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME_STUDENTS, null, null, null, null, null, null); if (cursor.moveToFirst()) { do { Student student = new Student(); student.setId(cursor.getString(cursor.getColumnIndex(COLUMN_ID))); student.setName(cursor.getString(cursor.getColumnIndex(COLUMN_NAME))); student.setMajor(cursor.getString(cursor.getColumnIndex(COLUMN_MAJOR))); studentList.add(student); } while (cursor.moveToNext()); } cursor.close(); db.close(); return studentList; } /** * 根据学生ID从数据库中删除学生信息 * @param studentId 要删除的学生的ID */ public void deleteStudent(String studentId) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_NAME_STUDENTS, COLUMN_ID + "=?", new String[]{studentId}); db.close(); // 关闭数据库连接 } }
SearchStudentFragment类
package com.example.myfinalwork; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.RadioButton; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class SearchStudentFragment extends Fragment { private EditText editTextSearchQuery; private RadioButton radioButtonByName, radioButtonById,radioButtonByMajor; private RecyclerView recyclerViewSearchResults; private SearchListAdapter searchResultsAdapter; private List<Student> searchedStudents; private StudentDBHelper dbHelper; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_search_student, container, false); // 初始化控件引用 editTextSearchQuery = rootView.findViewById(R.id.edit_text_search_query); radioButtonByName = rootView.findViewById(R.id.radio_button_name); radioButtonById = rootView.findViewById(R.id.radio_button_id); radioButtonByMajor = rootView.findViewById(R.id.radio_button_major); recyclerViewSearchResults = rootView.findViewById(R.id.recycler_view_search_results); recyclerViewSearchResults.setLayoutManager(new LinearLayoutManager(requireContext())); // 初始化数据库帮助类 dbHelper = new StudentDBHelper(getActivity().getApplicationContext()); // 初始化搜索结果列表的适配器 searchedStudents = new ArrayList<>(); searchResultsAdapter = new SearchListAdapter(requireContext(), searchedStudents); recyclerViewSearchResults.setAdapter(searchResultsAdapter); // 添加搜索按钮点击事件监听器 Button buttonSearch = rootView.findViewById(R.id.button_search); buttonSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String query = editTextSearchQuery.getText().toString().trim(); String searchBy; if (radioButtonByName.isChecked()) { searchBy = "name"; } else if (radioButtonById.isChecked()) { searchBy = "id"; } else if (radioButtonByMajor.isChecked()) { // 新增部分 searchBy = "major"; } else { searchBy = "name"; // 默认值,如果都没有选中则按照姓名搜索 } if (!query.isEmpty()) { searchedStudents.clear(); List<Student> students = dbHelper.searchStudents(query, searchBy); searchedStudents.addAll(students); searchResultsAdapter.notifyDataSetChanged(); if (searchedStudents.isEmpty()) { Toast.makeText(getContext(), "未找到匹配的学生", Toast.LENGTH_SHORT).show(); } } else { Toast.makeText(getContext(), "请输入搜索关键词", Toast.LENGTH_SHORT).show(); } } }); return rootView; } }
SearchListAdapter类
package com.example.myfinalwork; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class SearchListAdapter extends RecyclerView.Adapter<SearchListAdapter.StudentViewHolder> { private Context context; private List<Student> studentList; public SearchListAdapter(Context context, List<Student> studentList) { this.context = context; this.studentList = studentList; } @NonNull @Override public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(context).inflate(R.layout.item_student2, parent, false); return new StudentViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull StudentViewHolder holder, int position) { final Student currentStudent = studentList.get(position); holder.studentName.setText(currentStudent.getName()); holder.studentId.setText(currentStudent.getId()); holder.studentMajor.setText(currentStudent.getMajor()); } @Override public int getItemCount() { return studentList.size(); } // ViewHolder 类用于缓存视图组件 public static class StudentViewHolder extends RecyclerView.ViewHolder { TextView studentName, studentId, studentMajor; CheckBox checkBoxSelect; public StudentViewHolder(@NonNull View itemView) { super(itemView); studentName = itemView.findViewById(R.id.text_view_student_name); studentId = itemView.findViewById(R.id.text_view_student_id); studentMajor = itemView.findViewById(R.id.text_view_student_major); checkBoxSelect = itemView.findViewById(R.id.check_box_select); } } }
StudentListFragment类
package com.example.myfinalwork; import android.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.Toast; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class StudentListFragment extends Fragment implements StudentListAdapter.OnItemSelectedListener { private RecyclerView recyclerView; private StudentListAdapter adapter; private List<Student> studentList; private Button deleteButton; private List<Student> selectedStudents = new ArrayList<>(); private StudentDBHelper dbHelper; private AlertDialog deleteConfirmationDialog; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 加载fragment布局 View rootView = inflater.inflate(R.layout.fragment_student_list, container, false); // 初始化数据库助手 dbHelper = new StudentDBHelper(requireContext()); // 初始化RecyclerView和Adapter recyclerView = rootView.findViewById(R.id.recycler_view_students); recyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); // 这里可以填充或从数据库加载学生数据 // 初始化数据列表 studentList = new ArrayList<>(); studentList = dbHelper.getAllStudents(); // 创建并设置Adapter adapter = new StudentListAdapter(requireContext(), studentList); adapter.setOnItemSelectedListener(this); // 设置选择监听器 recyclerView.setAdapter(adapter); // 获取并设置删除按钮点击事件 deleteButton = rootView.findViewById(R.id.button_delete); deleteButton.setOnClickListener(v -> showDeleteConfirmationDialog()); // 获取并设置刷新按钮点击事件 Button refreshButton = rootView.findViewById(R.id.button_refresh); refreshButton.setOnClickListener(v -> { refreshStudentList(); Toast.makeText(requireContext(), "学生列表已刷新", Toast.LENGTH_SHORT).show(); }); return rootView; } // 显示删除确认对话框 private void showDeleteConfirmationDialog() { if (!selectedStudents.isEmpty()) { AlertDialog.Builder builder = new AlertDialog.Builder(requireContext()); View dialogView = LayoutInflater.from(requireContext()).inflate(R.layout.dialog_delete_confirm, null); Button btnCancel = dialogView.findViewById(R.id.button_cancel); Button btnDelete = dialogView.findViewById(R.id.button_delete); btnCancel.setOnClickListener(v -> deleteConfirmationDialog.dismiss()); btnDelete.setOnClickListener(v -> { for (Student student : selectedStudents) { dbHelper.deleteStudent(student.getId()); // 从数据库中删除学生 studentList.remove(student); // 从列表中移除学生 } selectedStudents.clear(); // 清空已删除的学生列表 adapter.notifyDataSetChanged(); // 刷新RecyclerView deleteConfirmationDialog.dismiss(); Toast.makeText(requireContext(), "删除成功", Toast.LENGTH_SHORT).show(); }); deleteConfirmationDialog = builder.setView(dialogView) .setTitle("删除确认") .create(); deleteConfirmationDialog.show(); } else { Toast.makeText(requireContext(), "请先选择要删除的学生", Toast.LENGTH_SHORT).show(); } } @Override public void onItemSelected(Student student, boolean selected) { if (selected) { selectedStudents.add(student); } else { selectedStudents.remove(student); } } public void refreshStudentList() { // 从数据库重新获取学生数据 studentList.clear(); // 清空现有数据 studentList.addAll(dbHelper.getAllStudents()); // 将新数据添加到studentList adapter.notifyDataSetChanged(); // 刷新RecyclerView的数据 } }
StudentListAdapter类
package com.example.myfinalwork; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import java.util.List; public class StudentListAdapter extends RecyclerView.Adapter<StudentListAdapter.StudentViewHolder> { private Context context; private List<Student> studentList; private OnItemSelectedListener listener; public StudentListAdapter(Context context, List<Student> studentList) { this.context = context; this.studentList = studentList; } // 添加一个接口,用于监听选择事件 public interface OnItemSelectedListener { void onItemSelected(Student student, boolean selected); } public void setOnItemSelectedListener(OnItemSelectedListener listener) { this.listener = listener; } @NonNull @Override public StudentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(context).inflate(R.layout.item_student1, parent, false); return new StudentViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull StudentViewHolder holder, int position) { final Student currentStudent = studentList.get(position); holder.studentName.setText(currentStudent.getName()); holder.studentId.setText(currentStudent.getId()); holder.studentMajor.setText(currentStudent.getMajor()); holder.checkBoxSelect.setChecked(currentStudent.isSelected()); holder.checkBoxSelect.setOnCheckedChangeListener((buttonView, isChecked) -> { if (listener != null) { currentStudent.setSelected(isChecked); listener.onItemSelected(currentStudent, isChecked); } }); } @Override public int getItemCount() { return studentList.size(); } // ViewHolder 类用于缓存视图组件 public static class StudentViewHolder extends RecyclerView.ViewHolder { TextView studentName, studentId, studentMajor; CheckBox checkBoxSelect; public StudentViewHolder(@NonNull View itemView) { super(itemView); studentName = itemView.findViewById(R.id.text_view_student_name); studentId = itemView.findViewById(R.id.text_view_student_id); studentMajor = itemView.findViewById(R.id.text_view_student_major); checkBoxSelect = itemView.findViewById(R.id.check_box_select); } } }
AddStudentFragment类
package com.example.myfinalwork; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import java.util.List; public class AddStudentFragment extends Fragment { private EditText editTextName, editTextId, editTextMajor; private Button buttonSubmit; private StudentDBHelper dbHelper; private StudentListRefreshListener refreshListener; // 移除MainActivity前缀,因为它是一个接口引用 public void setStudentListRefreshListener(StudentListRefreshListener listener) { this.refreshListener = listener; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_add_student, container, false); // 初始化控件引用 editTextName = rootView.findViewById(R.id.edit_text_name); editTextId = rootView.findViewById(R.id.edit_text_student_id); editTextMajor = rootView.findViewById(R.id.edit_text_major); buttonSubmit = rootView.findViewById(R.id.button_submit); // 初始化数据库帮助类 dbHelper = new StudentDBHelper(getActivity().getApplicationContext()); // 获取宿主Activity的引用并设置监听器(已在setupViewPager()中完成) // 添加提交按钮点击事件监听器 buttonSubmit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String name = editTextName.getText().toString().trim(); String id = editTextId.getText().toString().trim(); String major = editTextMajor.getText().toString().trim(); if (!name.isEmpty() && !id.isEmpty() && !major.isEmpty()) { Student newStudent = new Student(id, name, major); dbHelper.insertStudent(newStudent); editTextName.setText(""); editTextId.setText(""); editTextMajor.setText(""); Toast.makeText(getContext(), "学生信息已添加", Toast.LENGTH_SHORT).show(); // 添加完学生后,通知宿主Activity刷新学生列表 if (refreshListener != null) { refreshListener.onStudentListRefresh(); } } else { Toast.makeText(getContext(), "请确保所有字段都已填写", Toast.LENGTH_SHORT).show(); } } }); return rootView; } }
StudentListRefreshListener接口
package com.example.myfinalwork; public interface StudentListRefreshListener { void onStudentListRefresh(); }
XML布局文件
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.bottomnavigation.BottomNavigationView android:id="@+id/bottom_navigation_view" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:menu="@menu/bottom_navigation_menu" /> <androidx.viewpager2.widget.ViewPager2 android:id="@+id/view_pager" android:layout_width="0dp" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@+id/bottom_navigation_view" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
dialog_delete_confirm.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:padding="24dp" android:background="@color/white"> <!-- 提示信息 --> <TextView android:id="@+id/text_view_dialog_message" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="16sp" android:textStyle="bold" android:textColor="@color/black" android:text="确定要删除吗?" /> <!-- 水平分割线 --> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@color/black" /> <!-- 确认和取消按钮 --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="end" android:paddingTop="16dp"> <Button android:id="@+id/button_cancel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="取消" android:textStyle="bold" android:textColor="@color/black" android:background="?attr/selectableItemBackgroundBorderless" android:minWidth="96dp" /> <Button android:id="@+id/button_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确定" android:textStyle="bold" android:textColor="@color/black" android:background="?attr/selectableItemBackgroundBorderless" android:minWidth="96dp" android:layout_marginStart="16dp" /> </LinearLayout> </LinearLayout>
fragment_add_student.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <!-- 姓名输入框 --> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/th" app:layout_constraintTop_toTopOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/edit_text_name" /> <!-- 姓名输入框 --> <EditText android:id="@+id/edit_text_name" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="姓名" android:inputType="textPersonName" app:layout_constraintTop_toBottomOf="@id/imageView" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="32dp" /> <!-- 学号输入框 --> <EditText android:id="@+id/edit_text_student_id" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="学号" android:inputType="number" app:layout_constraintTop_toBottomOf="@id/edit_text_name" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="16dp" /> <!-- 专业输入框 --> <EditText android:id="@+id/edit_text_major" android:layout_width="0dp" android:layout_height="wrap_content" android:hint="专业" android:inputType="text" app:layout_constraintTop_toBottomOf="@id/edit_text_student_id" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" android:layout_marginTop="16dp" /> <!-- 提交按钮 --> <Button android:id="@+id/button_submit" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="68dp" android:text="确定" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.498" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/edit_text_major" /> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_search_student.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp"> <!-- 搜索栏 --> <com.google.android.material.textfield.TextInputLayout android:id="@+id/text_input_layout_search" style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <com.google.android.material.textfield.TextInputEditText android:id="@+id/edit_text_search_query" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="搜索姓名或学号" android:inputType="text|textCapWords|textMultiLine|textAutoComplete|textAutoCorrect"/> </com.google.android.material.textfield.TextInputLayout> <!-- 查询条件选择 --> <RadioGroup android:id="@+id/radio_group_search_by" android:layout_width="0dp" android:layout_height="wrap_content" android:checkedButton="@+id/radio_button_name" android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/text_input_layout_search"> <RadioButton android:id="@+id/radio_button_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按姓名搜索" /> <RadioButton android:id="@+id/radio_button_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按学号搜索" /> <RadioButton android:id="@+id/radio_button_major" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="按专业搜索" /> </RadioGroup> <!-- 搜索结果列表 --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view_search_results" android:layout_width="0dp" android:layout_height="0dp" android:scrollbars="vertical" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toTopOf="@+id/button_search_container" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/radio_group_search_by" /> <!-- 搜索按钮容器,用于将两个按钮保持在同一行且居中 --> <LinearLayout android:id="@+id/button_search_container" android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> <!-- 搜索按钮 --> <Button android:id="@+id/button_search" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="搜索" android:layout_marginEnd="8dp" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
fragment_student_list.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.MaterialToolbar android:id="@+id/toolbar" android:layout_width="0dp" android:layout_height="?attr/actionBarSize" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:title="学生信息管理" app:titleCentered="true"/> <!-- 分割线 --> <View android:id="@+id/view_separator" android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/black" app:layout_constraintBottom_toTopOf="@+id/recycler_view_students" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/toolbar" /> <!-- RecyclerView --> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view_students" android:layout_width="0dp" android:layout_height="0dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintBottom_toTopOf="@+id/button_container" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/view_separator" /> <!-- 按钮容器,用于包含“删除”和“刷新”按钮 --> <LinearLayout android:id="@+id/button_container" android:layout_width="0dp" android:layout_height="wrap_content" android:orientation="horizontal" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent"> <!-- 删除按钮 --> <Button android:id="@+id/button_delete" android:layout_width="0dp" android:layout_height="46dp" android:layout_weight="1" android:text="删除" android:textAllCaps="false" android:textColor="@android:color/white" android:layout_marginEnd="8dp" /> <!-- 刷新按钮 --> <Button android:id="@+id/button_refresh" android:layout_width="0dp" android:layout_height="46dp" android:layout_weight="1" android:text="刷新" android:textAllCaps="false" android:textColor="@android:color/white" /> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
item_student1.xml
<!-- item_student.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp"> <!-- 学生姓名 --> <TextView android:id="@+id/text_view_student_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="16sp" /> <!-- 学生学号 --> <TextView android:id="@+id/text_view_student_id" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="14sp" android:layout_marginStart="16dp" /> <!-- 学生专业 --> <TextView android:id="@+id/text_view_student_major" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="14sp" android:layout_marginStart="16dp" /> <!-- 选中框 --> <CheckBox android:id="@+id/check_box_select" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:checked="false" android:layout_marginStart="16dp" /> </LinearLayout>
item_student2.xml
<!-- item_student.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="16dp"> <!-- 学生姓名 --> <TextView android:id="@+id/text_view_student_name" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="16sp" /> <!-- 学生学号 --> <TextView android:id="@+id/text_view_student_id" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="14sp" android:layout_marginStart="16dp" /> <!-- 学生专业 --> <TextView android:id="@+id/text_view_student_major" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textSize="14sp" android:layout_marginStart="16dp" /> <!-- 选中框 --> </LinearLayout>
bottom_navigation_menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@id/action_student_list" android:icon="@android:drawable/ic_dialog_dialer" android:title="学生列表" /> <item android:id="@id/action_add_student" android:icon="@android:drawable/ic_input_add" android:title="添加" /> <item android:id="@id/action_search_student" android:icon="@android:drawable/ic_menu_search" android:title="搜索" /> </menu>