个人作业Android学习系统开发日志五

news/2025/4/2 11:01:29/文章来源:https://www.cnblogs.com/zhanglijian/p/18797134

Android实现:
DailySummary:
entity:

package com.example.learningmanagement.entitydata class DailySummary(val id: Int,val userId: Int,val url: String = ""
)

adapter:

package com.example.learningmanagement.adapterimport android.content.Intent
import android.net.Uri
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.DailySummaryclass DailySummaryAdapter : ListAdapter<DailySummary, DailySummaryAdapter.ViewHolder>(DiffCallback()) {override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.item_daily_summary, parent, false)return ViewHolder(view)}override fun onBindViewHolder(holder: ViewHolder, position: Int) {val dailySummary = getItem(position)holder.bind(dailySummary)}class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {private val tvUrl: TextView = itemView.findViewById(R.id.tvUrl)fun bind(dailySummary: DailySummary) {tvUrl.text = dailySummary.url// 设置点击事件,打开URLitemView.setOnClickListener {val intent = Intent(Intent.ACTION_VIEW, Uri.parse(dailySummary.url))itemView.context.startActivity(intent)}}}class DiffCallback : DiffUtil.ItemCallback<DailySummary>() {override fun areItemsTheSame(oldItem: DailySummary, newItem: DailySummary): Boolean {return oldItem.id == newItem.id}override fun areContentsTheSame(oldItem: DailySummary, newItem: DailySummary): Boolean {return oldItem == newItem}}
}

service:


package com.example.learningmanagement.serviceimport com.example.learningmanagement.entity.ApiResponse
import com.example.learningmanagement.entity.DailySummary
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.Pathinterface DailySummaryService {@GET("daily/selectAll/{userId}")suspend fun getDailySummaries(@Path("userId") userId: String): ApiResponse<List<DailySummary>>@POST("daily/add")suspend fun addDailySummary(@Body dailySummary: DailySummary): ApiResponse<DailySummary>
}

fragment:

package com.example.learningmanagement.ui.fragmentimport android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AlertDialog
import androidx.fragment.app.Fragment
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.learningmanagement.R
import com.example.learningmanagement.adapter.DailySummaryAdapter
import com.example.learningmanagement.databinding.FragmentDailySummaryBinding
import com.example.learningmanagement.entity.DailySummary
import com.example.learningmanagement.network.ServiceCreater
import com.example.learningmanagement.service.DailySummaryService
import com.example.learningmanagement.ui.MainActivity
import com.example.learningmanagement.utils.PrefsHelper
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launchclass DailySummaryFragment : Fragment() {private var _binding: FragmentDailySummaryBinding? = nullprivate val binding get() = _binding!!private val dailySummaryService = ServiceCreater.create<DailySummaryService>()private val dailySummaryAdapter = DailySummaryAdapter()private lateinit var prefs: PrefsHelperoverride fun onAttach(context: Context) {super.onAttach(context)prefs = PrefsHelper(context)}override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View {_binding = FragmentDailySummaryBinding.inflate(inflater, container, false)return binding.root}override fun onViewCreated(view: View, savedInstanceState: Bundle?) {super.onViewCreated(view, savedInstanceState)setupRecyclerView()setupFab()loadDailySummaries()// 更新标题(activity as? MainActivity)?.updateWeekTitle("日总结")}private fun setupRecyclerView() {binding.rvDailySummaries.apply {layoutManager = LinearLayoutManager(context)adapter = dailySummaryAdapter}}private fun setupFab() {binding.fabAddDailySummary.setOnClickListener {showAddDailySummaryDialog()}}private fun showAddDailySummaryDialog() {val dialogView = layoutInflater.inflate(R.layout.dialog_add_daily_summary, null)val etUrl = dialogView.findViewById<EditText>(R.id.etUrl)AlertDialog.Builder(requireContext()).setTitle("添加日总结").setView(dialogView).setPositiveButton("保存") { _, _ ->val url = etUrl.text.toString().trim()if (url.isEmpty()) {showToast("URL不能为空")return@setPositiveButton}// 保存日总结saveDailySummary(url)}.setNegativeButton("取消", null).show()}private fun saveDailySummary(url: String) {lifecycleScope.launch {try {val userId = prefs.getUserId()userId?.let { id ->val dailySummary = DailySummary(id = 0, // 后端会自动生成IDuserId = id.toInt(),url = url)val response = dailySummaryService.addDailySummary(dailySummary)if (response.code == "200") {showToast("添加成功")loadDailySummaries() // 刷新列表} else {showToast("添加失败: ${response.msg}")}} ?: run {showToast("用户未登录")}} catch (e: Exception) {showToast("网络错误: ${e.message}")}}}private fun loadDailySummaries() {if (!isAdded) returnlifecycleScope.launch {try {val userId = prefs.getUserId()userId?.let { id ->try {if (!isActive) return@launchval response = dailySummaryService.getDailySummaries(id)if (!isActive || !isAdded || _binding == null) return@launchif (response.code == "200") {response.data?.let { summaries ->if (summaries.isNotEmpty()) {// 有数据时显示列表dailySummaryAdapter.submitList(summaries)binding.rvDailySummaries.visibility = View.VISIBLEbinding.tvEmptyData.visibility = View.GONE} else {// 数据为空时显示提示dailySummaryAdapter.submitList(emptyList())showEmptyView()}} ?: run {// 响应数据为nulldailySummaryAdapter.submitList(emptyList())showEmptyView()}} else {// 请求成功但状态码不是200showToast("获取数据失败: ${response.msg}")showEmptyView()}} catch (e: CancellationException) {// 协程被取消,正常情况,不需要处理} catch (e: Exception) {if (!isActive || !isAdded || _binding == null) return@launchval errorMessage = "网络请求错误: ${e.javaClass.simpleName} - ${e.message}"showToast(errorMessage)showEmptyView()}} ?: run {if (!isActive || !isAdded || _binding == null) return@launchshowToast("用户未登录")showEmptyView()}} catch (e: CancellationException) {// 协程被取消,正常情况,不需要处理} catch (e: Exception) {if (!isActive || !isAdded || _binding == null) return@launchval errorMessage = "加载失败: ${e.javaClass.simpleName} - ${e.message}"showToast(errorMessage)showEmptyView()}}}private fun showEmptyView() {if (!isAdded || _binding == null) returnbinding.tvEmptyData.visibility = View.VISIBLEbinding.rvDailySummaries.visibility = View.GONE}private fun showToast(message: String) {if (isAdded && activity != null) {activity?.let { Toast.makeText(it, message, Toast.LENGTH_SHORT).show()}}}override fun onDestroyView() {super.onDestroyView()_binding = null}fun refreshData() {if (isAdded && _binding != null) {loadDailySummaries()}}
}

xml:

<?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="wrap_content"android:orientation="vertical"android:padding="16dp"><com.google.android.material.textfield.TextInputLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginBottom="8dp"><EditTextandroid:id="@+id/etUrl"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="URL地址"android:inputType="textUri" /></com.google.android.material.textfield.TextInputLayout></LinearLayout>
<?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"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/rvDailySummaries"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><TextViewandroid:id="@+id/tvEmptyData"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="暂无数据"android:textSize="18sp"android:visibility="gone"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fabAddDailySummary"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="16dp"android:contentDescription="添加日总结"android:src="@android:drawable/ic_input_add"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent" /></androidx.constraintlayout.widget.ConstraintLayout>
<?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="8dp"app:cardCornerRadius="8dp"app:cardElevation="4dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:padding="16dp"><TextViewandroid:id="@+id/tvUrl"android:layout_width="match_parent"android:layout_height="wrap_content"android:autoLink="web"android:textColor="@color/purple_500"android:textSize="16sp" /></LinearLayout>
</androidx.cardview.widget.CardView>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/908808.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20241220廖补林实验二《Python程序设计》实验报告

实验二 计算器设计 (一)实验内容 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。 考核基本语法、判定语句、循环语句、逻辑运算等知识点 (二)实验要求 创建工程项目,使用Python语言实现具体的操作运算,并完成程序调试和运行,代码托管到码云。 我用…

网络基础

一、概念 冲突域设备发送数据会产生冲突的网络范围 集线器的所有接口在同一个冲突域 交换机的每个接口都是一个独立的冲突域寻址IP寻址是寻找目标在某一个范围 MAC寻址是具体寻找某一个设备MTU数据包的最大传输单元 接口收发数据支持的单个包的最大长度 以太网接口默认MTU1500B…

20241309 实验二《Python程序设计》实验报告

20241309 2024-2025-2 《Python程序设计》实验二报告 课程:《Python程序设计》 班级: 2413 姓名: 梅良谦 学号:20241309 实验教师:王志强 实验日期:2025年3月26日 必修/选修: 公选课 一、实验内容 1.设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。…

【操作系统】进程管理(二)

一、前言之前已经介绍了操作系统的各个模块,现在来具体深入学习操作系统中的进程管理。 二、进程的基本概念在未配置OS的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完成后,才允许另外一个程序执行;在多道程序环境下,则允许多个程序并发执行。也正是程序的并发…

MybatisPlus--持久层接口

IService: Save()boolean save(T entity) //批量插入 boolean saveBatch(Collection<T> entityList) boolean saveBatch(Collection<T> entityList, int vatchSIze)SQL:INSERT INTO user (name, email) VALUES (John Doe, john.doe@example.com)批量SQL:INSERT…

CH58x/CH59x动态修改广播包

前言:在日常使用中我们可能有需要动态修改广播包的情况。从机设备不走连接将一些传感器数据通过广播包显示出来 程序中提供了接口函数进行动态修改不用再先关闭广播再重新开启。/******************************************************************************** @fn …

docker 容器部署nginx+keepalived实现高可用

准备两台机器分别部署nginx和keepalived,事先部署好docker容器环境。主机名 ip地址 部署容器park2-0007 10.9.102.62 nginx+keepalivedpark2-0008 10.9.102.63 nginx+keepalived分别启动两个nginx容器docker run -d \--name my-nginx -p 8005:8005 \-v ./nginxdir/default.c…

GraphRAG介绍

一、RAG原理 用户输入了一个指令Instruct,RAG将其与Document store(向量库)中的预存文本进行匹配,然后将符合条件的筛选文本(Retrieved Documents)与指令Instruct,共同合成为一个增强型的Prompt,并将该增强型Prompt喂给大模型,最终大模型根据此增强型Prompt,生成最终的Re…

清理Docker数据卷volumes

原文链接地址 清理Docker数据卷volumes1.查看磁盘使用 2.查看Docker数据卷及磁盘使用情况 3.Docker 删除无用数据卷今天突然发现跑服务器的磁盘满了。记录下进入服务查看到Docker-Overlay2磁盘空间的清理方法:清理Docker的数据卷volumes Docker在长时间使用的情况下,经常需…

Web开发SpringBoot流程性的学习----回顾补充1

HTML(HyperText Markup Language)**:超文本标记语言 超文本:超越了文本的限制,比普通文本更强大。除了文字信息,还可以定义图片、音频、视频等内容。 标记语言:由标签构成的语言HTML标签都是预定义好的。例如:使用展示超链接,展示图片,展示视频。 HTML代码直接在浏览器中运…

【我的青春coding物语果然有问题!】第四次上机卡题复盘

最近事多 今天才写出来 实际做的时候变量名犯了很多很唐的错误 这里就不一一说了 我们看一下今天要讲的题目 05:正整数的任意进制转换 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为[2,36],其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,...,Z…

【PCIE711-214】基于PCIe总线架构的4路HD-SDI/3G-SDI视频图像模拟源

产品概述 PCIE711-214是一款基于PCIE总线架构的4路SDI视频模拟源。该板卡为标准的PCIE插卡,全高尺寸,适合与PCIE总线的工控机或者服务器,板载协议处理器,可以通过PCIE总线将上位机的YUV 422格式视频数据下发通过SDI接口播放出去,从而模拟SDI协议标准的视频流。该板卡支持4…