본문 바로가기

📱/📘Project

[Kotlin] TodoList 앱 만들기2

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