Android开发:Kotlin实现7天屏幕时间录入与周平均计算方案咨询
7天屏幕时间录入与周平均统计实现方案
一、数据模型设计
先定义数据类统一管理单天记录,数组/列表存储7天数据更清晰:
// Kotlin示例,Java可改用JavaBean data class ScreenTimeRecord( val date: String, // 日期格式如"2024-05-20" val morningTime: Int, // 早屏幕时间(分钟) val eveningTime: Int, // 晚屏幕时间(分钟) val remark: String // 当日备注 ) // 初始化7天空记录的列表 val weeklyRecords = mutableListOf<ScreenTimeRecord>()
二、用ListView实现规整的录入界面
1. 自定义列表项布局(item_screen_time.xml)
每个列表项对应一天的录入字段,避免EditText杂乱堆积:
<?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" android:background="@drawable/item_border" <!-- 可选:添加边框区分项 --> android:layout_marginBottom="8dp"> <EditText android:id="@+id/et_date" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入日期(如2024-05-20)" android:inputType="date" /> <EditText android:id="@+id/et_morning_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="早屏幕时间(分钟)" android:inputType="number" android:layout_marginTop="8dp" /> <EditText android:id="@+id/et_evening_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="晚屏幕时间(分钟)" android:inputType="number" android:layout_marginTop="8dp" /> <EditText android:id="@+id/et_remark" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="当日备注" android:layout_marginTop="8dp" /> </LinearLayout>
2. 自定义ListView适配器
通过适配器绑定数据与列表项,实时同步用户输入:
class ScreenTimeAdapter( private val context: Context, private val records: MutableList<ScreenTimeRecord> ) : BaseAdapter() { override fun getCount(): Int = records.size override fun getItem(position: Int): ScreenTimeRecord = records[position] override fun getItemId(position: Int): Long = position.toLong() override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = convertView ?: LayoutInflater.from(context) .inflate(R.layout.item_screen_time, parent, false) val etDate = view.findViewById<EditText>(R.id.et_date) val etMorning = view.findViewById<EditText>(R.id.et_morning_time) val etEvening = view.findViewById<EditText>(R.id.et_evening_time) val etRemark = view.findViewById<EditText>(R.id.et_remark) val currentRecord = records[position] // 初始化输入框内容 etDate.setText(currentRecord.date) etMorning.setText(currentRecord.morningTime.toString()) etEvening.setText(currentRecord.eveningTime.toString()) etRemark.setText(currentRecord.remark) // 监听输入变化,实时更新列表数据 etDate.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { records[position] = currentRecord.copy(date = s.toString()) } override fun afterTextChanged(s: Editable?) {} }) etMorning.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val time = s.toString().toIntOrNull() ?: 0 records[position] = currentRecord.copy(morningTime = time) } override fun afterTextChanged(s: Editable?) {} }) etEvening.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { val time = s.toString().toIntOrNull() ?: 0 records[position] = currentRecord.copy(eveningTime = time) } override fun afterTextChanged(s: Editable?) {} }) etRemark.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { records[position] = currentRecord.copy(remark = s.toString()) } override fun afterTextChanged(s: Editable?) {} }) return view } }
3. 主Activity初始化ListView
class MainActivity : AppCompatActivity() { private lateinit var listView: ListView private lateinit var adapter: ScreenTimeAdapter private val weeklyRecords = mutableListOf<ScreenTimeRecord>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) listView = findViewById(R.id.list_view) // 初始化7条空记录 repeat(7) { weeklyRecords.add(ScreenTimeRecord("", 0, 0, "")) } adapter = ScreenTimeAdapter(this, weeklyRecords) listView.adapter = adapter // 跳转到统计页面的按钮逻辑 findViewById<Button>(R.id.btn_calculate).setOnClickListener { val intent = Intent(this, StatActivity::class.java) // 传递数据(Kotlin data类默认实现Serializable) intent.putExtra("weekly_records", ArrayList(weeklyRecords)) startActivity(intent) } } }
主Activity布局(activity_main.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="match_parent" android:orientation="vertical" android:padding="16dp"> <ListView android:id="@+id/list_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:id="@+id/btn_calculate" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="计算周平均屏幕时间" android:layout_marginTop="16dp" /> </LinearLayout>
三、周平均统计页面实现
1. 统计页面布局(activity_stat.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="match_parent" android:orientation="vertical" android:padding="16dp" android:gravity="center"> <TextView android:id="@+id/tv_avg_morning" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:layout_marginBottom="16dp" /> <TextView android:id="@+id/tv_avg_evening" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:layout_marginBottom="16dp" /> <TextView android:id="@+id/tv_avg_total" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20sp" android:textStyle="bold" /> </LinearLayout>
2. 统计页面逻辑(StatActivity.kt)
class StatActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_stat) // 获取传递的记录数据 val records = intent.getSerializableExtra("weekly_records") as ArrayList<ScreenTimeRecord> // 计算总时长 var totalMorning = 0 var totalEvening = 0 records.forEach { totalMorning += it.morningTime totalEvening += it.eveningTime } // 计算平均(保留1位小数) val avgMorning = totalMorning / 7.0 val avgEvening = totalEvening / 7.0 val avgTotal = (totalMorning + totalEvening) / 7.0 // 展示结果 findViewById<TextView>(R.id.tv_avg_morning).text = "早屏幕时间周平均:%.1f分钟".format(avgMorning) findViewById<TextView>(R.id.tv_avg_evening).text = "晚屏幕时间周平均:%.1f分钟".format(avgEvening) findViewById<TextView>(R.id.tv_avg_total).text = "每日总屏幕时间周平均:%.1f分钟".format(avgTotal) } }
四、优化建议
- 日期输入可改用
DatePickerDialog替代EditText,避免格式错误。 - 添加输入验证:限制屏幕时间为非负数,校验日期格式。
- 若需持久化数据,可使用SharedPreferences或Room数据库保存记录。
内容的提问来源于stack exchange,提问作者noobieCoder
相关产品推荐
相关产品推荐

