个人作业第二阶段2
完成第二阶段教师功能:查询学生每日总结
创建学生每日总结页面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/etSearch"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="输入学生姓名或学号"
android:inputType="text"
android:padding="8dp" />
<Button
android:id="@+id/btnSearch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="搜索" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvStudentSummaries"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp" />
</LinearLayout>
创建每日总结列表项布局:
<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView 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="wrap_content"
android:layout_margin="4dp"
app:cardCornerRadius="8dp"
app:cardElevation="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="12dp">
<TextView
android:id="@+id/tvStudentName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tvStudentId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp" />
<TextView
android:id="@+id/tvSummaryUrl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:autoLink="web"
android:textSize="14sp" />
</LinearLayout>
</androidx.cardview.widget.CardView>
修改 TeacherMainActivity 添加点击事件:
class TeacherMainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_teacher_main)
findViewById<Button>(R.id.btnCheckDailyLogs).setOnClickListener {
startActivity(Intent(this, StudentLogsActivity::class.java))
}
findViewById<Button>(R.id.btnOtherFunction).setOnClickListener {
startActivity(Intent(this, StudentSummariesActivity::class.java))
}
}
}
创建学生每日总结适配器:
package com.example.learningmanagement.adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.example.learningmanagement.R
import com.example.learningmanagement.entity.DailySummary
class StudentSummariesAdapter : ListAdapter<DailySummary, StudentSummariesAdapter.ViewHolder>(DiffCallback()) {
class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
val tvStudentName: TextView = view.findViewById(R.id.tvStudentName)
val tvStudentId: TextView = view.findViewById(R.id.tvStudentId)
val tvSummaryUrl: TextView = view.findViewById(R.id.tvSummaryUrl)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_student_summary, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val item = getItem(position)
holder.tvStudentName.text = "姓名: ${item.username}"
holder.tvStudentId.text = "学号: ${item.userId}"
holder.tvSummaryUrl.text = "总结链接: ${item.url}"
}
private class DiffCallback : DiffUtil.ItemCallback<DailySummary>() {
override fun areItemsTheSame(oldItem: DailySummary, newItem: DailySummary) =
oldItem.id == newItem.id
override fun areContentsTheSame(oldItem: DailySummary, newItem: DailySummary) =
oldItem == newItem
}
}
创建学生每日总结活动:
package com.example.learningmanagement.ui
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.learningmanagement.R
import com.example.learningmanagement.adapter.StudentSummariesAdapter
import com.example.learningmanagement.entity.DailySummary
import com.example.learningmanagement.network.ServiceCreater
import com.example.learningmanagement.service.DailySummaryService
import com.example.learningmanagement.service.UserApiService
import kotlinx.coroutines.launch
class StudentSummariesActivity : AppCompatActivity() {
private lateinit var adapter: StudentSummariesAdapter
private lateinit var etSearch: EditText
private lateinit var btnSearch: Button
private lateinit var rvStudentSummaries: RecyclerView
private val dailySummaryService = ServiceCreater.create<DailySummaryService>()
private val userService = ServiceCreater.create<UserApiService>()
private var allSummaries = listOf<DailySummary>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_student_summaries)
etSearch = findViewById(R.id.etSearch)
btnSearch = findViewById(R.id.btnSearch)
rvStudentSummaries = findViewById(R.id.rvStudentSummaries)
setupRecyclerView()
loadAllStudentSummaries()
btnSearch.setOnClickListener {
searchSummaries()
}
}
private fun setupRecyclerView() {
adapter = StudentSummariesAdapter()
rvStudentSummaries.apply {
layoutManager = LinearLayoutManager(this@StudentSummariesActivity)
adapter = this@StudentSummariesActivity.adapter
}
}
private fun loadAllStudentSummaries() {
lifecycleScope.launch {
try {
val response = userService.selectAll()
if (response.code == "200") {
response.data?.let { users ->
// 过滤出学生用户
val students = users.filter { it.role == 0 }
// 获取所有学生的每日总结
val summariesList = mutableListOf<DailySummary>()
for (student in students) {
val summariesResponse = dailySummaryService.selectByUsername(student.username)
if (summariesResponse.code == "200") {
summariesResponse.data?.let { summaries ->
summariesList.addAll(summaries)
}
}
}
// 按ID降序排序,最新的记录显示在最上方
allSummaries = summariesList.sortedByDescending { it.id }
adapter.submitList(allSummaries)
}
} else {
Toast.makeText(this@StudentSummariesActivity, "获取学生列表失败", Toast.LENGTH_SHORT).show()
}
} catch (e: Exception) {
Toast.makeText(this@StudentSummariesActivity, "网络错误: ${e.message}", Toast.LENGTH_SHORT).show()
}
}
}
private fun searchSummaries() {
val searchText = etSearch.text.toString().trim()
if (searchText.isEmpty()) {
// 如果搜索框为空,显示所有记录
adapter.submitList(allSummaries)
return
}
// 根据学生姓名或学号搜索
val filteredList = allSummaries.filter {
it.username.contains(searchText, ignoreCase = true) ||
it.userId.toString().contains(searchText)
}
adapter.submitList(filteredList)
if (filteredList.isEmpty()) {
Toast.makeText(this, "未找到匹配的记录", Toast.LENGTH_SHORT).show()
}
}
}
在 DailySummaryService 中添加根据用户名查询的方法:
@GET("/daily/selectByUsername/{username}")
suspend fun selectByUsername(@Path("username") username: String): ApiResponse<List<DailySummary>>
在 AndroidManifest.xml 中注册新活动:
<!-- 在application标签内添加 -->
<activity
android:name=".ui.StudentSummariesActivity"
android:exported="false"
android:theme="@style/AppTheme" />

浙公网安备 33010602011771号