个人作业第二阶段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" />
posted @ 2025-04-21 23:35  vivi_vimi  阅读(9)  评论(0)    收藏  举报