UI 구성은 다 끝냈으므로 이제 기능들을 넣어봄.
제일 먼저 해야 하는 ViewBinding 설정 먼저 해줌.
▪️ViewBinding
https://velog.io/@eoqkrskfk94/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-View-Binding
안드로이드 View Binding
뷰 바인딩은 Activity나 fragment와 같은 뷰와 상호 작용할때 보다 쉽게 코드를 작성할 수 있게 지원해주는 기능입니다. 간단하게 우리가 뷰와 상호 작용할때 주로 쓰는 findViewById를 쓰지 않고 뷰 컴
velog.io
plugins {
...
}
android {
...
// ViewBinding 추가
buildFeatures {
viewBinding = true
}
}
dependencies {
...
}
build.gradle (module)
이제 기능들을 추가해볼거임.
각 설명들은 주석으로 달아놨고 궁금한 점은 댓글로 부탁함.
package com.ta2gi.todolist
import android.app.Activity
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.View
import android.view.inputmethod.InputMethodManager
import androidx.core.content.ContentProviderCompat.requireContext
import androidx.recyclerview.widget.LinearLayoutManager
import com.google.android.material.snackbar.Snackbar
import com.ta2gi.todolist.databinding.ActivityMainBinding
import java.text.SimpleDateFormat
import java.util.*
class MainActivity : AppCompatActivity(), View.OnClickListener {
// binding 선언
lateinit var binding: ActivityMainBinding
// 할 일 목록을 담을 리스트 선언
val todoList = mutableListOf<TodoEntity>()
// adapter 선언
val mainAdapter = MainAdapter(todoList)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// binding 초기화
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// adapter 장착
binding.maiList.adapter = mainAdapter
// 클릭 리스너
binding.maiAddButton.setOnClickListener(this)
}
override fun onClick(view : View?) {
when(view) {
binding.maiAddButton -> {
// 입력한 문자열 가져오기
val writeText = binding.maiTodoText.text.toString().trim()
if(writeText.isEmpty()) {
// 스낵바 알림창 띄우기
Snackbar.make(binding.root, "❗공백은 입력할 수 없습니다", Snackbar.LENGTH_SHORT).show()
return
}
// 오늘 날짜 가져오기
val sdf = SimpleDateFormat("YY.MM.dd", Locale.KOREAN)
val date = sdf.format(System.currentTimeMillis())
// 리스트에 추가하기
val todoEntity = TodoEntity(false, writeText, date)
todoList.add(todoEntity)
// adapter에 리스트가 변경된지 알려주기
mainAdapter.notifyDataSetChanged()
// 텍스트 비워주고 키보드 내리기
binding.maiTodoText.setText("")
hideKeyboard(this)
}
}
}
// 키보드 내리기
fun hideKeyboard(act : Activity) {
val imm = act.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(act.currentFocus?.windowToken, 0)
}
}
MainActivity.kt
다음으로 Adapter를 만져주러 감.
이 부분도 주석으로 설명해 놓았음!
package com.ta2gi.todolist
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CheckBox
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class MainAdapter(val todoList : MutableList<TodoEntity>) : RecyclerView.Adapter<MainAdapter.ViewHolderClass>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainAdapter.ViewHolderClass {
// 대충 항목의 layout은 R.layout.list_item이라는 것
val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
return ViewHolderClass(view)
}
override fun onBindViewHolder(holder: MainAdapter.ViewHolderClass, position: Int) {
// position 0 = 첫 번째 항목
holder.state.isChecked = todoList[position].state
holder.todo.text = todoList[position].todo
holder.date.text = todoList[position].date
}
override fun getItemCount(): Int {
// 리스트에 담긴 항목의 크기만큼 나오게하기
return todoList.size
}
inner class ViewHolderClass(view : View) : RecyclerView.ViewHolder(view) {
// 상태, 할 일, 날짜를 담고있는 애들
val state = view.findViewById<CheckBox>(R.id.lis_state)
val todo = view.findViewById<TextView>(R.id.lis_todo)
val date = view.findViewById<TextView>(R.id.lis_date)
}
}
MainAdapter.kt
To be Continued..
'📱 > 📘Project' 카테고리의 다른 글
[Kotlin] Note 앱 만들기3 (1) | 2023.01.11 |
---|---|
[Kotlin] Note 앱 만들기2 (0) | 2023.01.10 |
[Kotlin] Note 앱 만들기1 (0) | 2023.01.09 |
[Kotlin] TodoList 앱 만들기3 (0) | 2023.01.03 |
[Kotlin] TodoList 앱 만들기1 (0) | 2022.12.29 |