From a5c10a45c60c67ac7b197425594849f39441ae20 Mon Sep 17 00:00:00 2001 From: Sangjin Kim Date: Mon, 7 Jul 2025 01:04:19 +0900 Subject: [PATCH 1/2] =?UTF-8?q?11=EC=A3=BC=EC=B0=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/AndroidProjectSystem.xml | 6 ++ .idea/compiler.xml | 6 ++ .idea/gradle.xml | 18 +++++ .idea/kotlinc.xml | 6 ++ .idea/migrations.xml | 10 +++ .idea/misc.xml | 7 ++ .../example/bcsd_android_2025_1/ListData.kt | 3 + .../bcsd_android_2025_1/MainActivity.kt | 79 ++++++++++++++++++- .../RecyclerViewAdapter.kt | 42 ++++++++++ app/src/main/res/layout/activity_main.xml | 53 ++++++++++++- app/src/main/res/layout/item_recyclerview.xml | 19 +++++ app/src/main/res/values/strings.xml | 6 ++ 12 files changed, 249 insertions(+), 6 deletions(-) create mode 100644 .idea/AndroidProjectSystem.xml create mode 100644 .idea/compiler.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/kotlinc.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt create mode 100644 app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt create mode 100644 app/src/main/res/layout/item_recyclerview.xml diff --git a/.idea/AndroidProjectSystem.xml b/.idea/AndroidProjectSystem.xml new file mode 100644 index 0000000..4a53bee --- /dev/null +++ b/.idea/AndroidProjectSystem.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b86273d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..97f0a8e --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..c224ad5 --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..02a7102 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt b/app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt new file mode 100644 index 0000000..4010377 --- /dev/null +++ b/app/src/main/java/com/example/bcsd_android_2025_1/ListData.kt @@ -0,0 +1,3 @@ +package com.example.bcsd_android_2025_1 + +data class ListData(val time : String) \ No newline at end of file diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt b/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt index 3ffa0eb..6f48720 100644 --- a/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt +++ b/app/src/main/java/com/example/bcsd_android_2025_1/MainActivity.kt @@ -1,14 +1,87 @@ package com.example.bcsd_android_2025_1 import android.os.Bundle -import androidx.activity.enableEdgeToEdge +import android.os.Handler +import android.os.Looper +import android.os.SystemClock +import android.widget.Button +import android.widget.TextView import androidx.appcompat.app.AppCompatActivity -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView class MainActivity : AppCompatActivity() { + private lateinit var timeTextView: TextView + private lateinit var startPauseButton:Button + private lateinit var stopButton:Button + private lateinit var lapButton:Button + private lateinit var recyclerViewAdapter: RecyclerViewAdapter + private lateinit var recyclerView:RecyclerView + + private var isRunning = false + private var startTime = 0L + private var pauseOffset = 0L + + + private val handler = Handler(Looper.getMainLooper()) + private val timeRunnable = object:Runnable{ + override fun run(){ + val elapsed = SystemClock.elapsedRealtime() - startTime + val min = (elapsed / 1000) / 60 + val sec = (elapsed / 1000) % 60 + val mil = (elapsed % 1000) / 10 + timeTextView.text = getString(R.string.time_text, min, sec, mil) + handler.postDelayed(this,10) + } + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + + timeTextView = findViewById(R.id.time_textview) + startPauseButton = findViewById(R.id.start_pause_toggle_button) + stopButton = findViewById(R.id.stop_button) + lapButton = findViewById(R.id.lap_button) + recyclerView = findViewById(R.id.recycler_view) + recyclerViewAdapter = RecyclerViewAdapter() + recyclerView.adapter = recyclerViewAdapter + recyclerView.layoutManager = LinearLayoutManager(this) + + startPauseButton.setOnClickListener { + if(!isRunning){ + startPauseButton.text = getString(R.string.pause_text) + startTime = SystemClock.elapsedRealtime() - pauseOffset + handler.post(timeRunnable) + isRunning=true + }else{ + startPauseButton.text=getString(R.string.start_text) + pauseOffset = SystemClock.elapsedRealtime() - startTime + handler.removeCallbacks(timeRunnable) + isRunning=false + } + } + + stopButton.setOnClickListener { + handler.removeCallbacks(timeRunnable) + timeTextView.text = getString(R.string.default_time_text) + startPauseButton.text = getString(R.string.start_text) + isRunning = false + pauseOffset = 0L + recyclerViewAdapter.removeAllItems() + } + + lapButton.setOnClickListener { + if(isRunning){ + val elapsed = SystemClock.elapsedRealtime() - startTime + val min = (elapsed / 1000) / 60 + val sec = (elapsed / 1000) % 60 + val mil = (elapsed % 1000) / 10 + val nowTime = getString(R.string.time_text, min, sec, mil) + + recyclerViewAdapter.addLapItem(nowTime) + recyclerView.scrollToPosition(0) + } + } } } \ No newline at end of file diff --git a/app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt b/app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt new file mode 100644 index 0000000..2e829f8 --- /dev/null +++ b/app/src/main/java/com/example/bcsd_android_2025_1/RecyclerViewAdapter.kt @@ -0,0 +1,42 @@ +package com.example.bcsd_android_2025_1 + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView + +class RecyclerViewAdapter:RecyclerView.Adapter(){ + private val items = mutableListOf() + + inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { + private val lapItemTextView: TextView = view.findViewById(R.id.lap_item_textview) + + fun bind(item: ListData) { + lapItemTextView.text = item.time + } + } + + fun addLapItem(time:String){ + items.add(0, ListData(time)) + notifyItemInserted(0) + } + + fun removeAllItems(){ + items.clear() + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + val inflatedView = LayoutInflater.from(parent.context).inflate(R.layout.item_recyclerview, parent, false) + return ViewHolder(inflatedView) + } + + override fun getItemCount(): Int{ + return items.size + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 311f3cb..9ea7123 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,12 +8,59 @@ tools:context=".MainActivity"> + +