본문 바로가기
SW/개발

[Android/Kotlin] Todo List 앱을 만들어보자! - 6 (할 일 수정)

by PEKAH 2021. 11. 19.

본 포스트는 Todo List 앱을 만들어보자! - 5 에 이어지는 글입니다.

 

이번에는 todo의 수정 기능을 개발해보겠습니다.

 

메인화면에서 목록을 클릭했을 때 EditTodoActivity로 이동하는 작업을 먼저 하도록 하겠습니다.

아이템의 이벤트 처리는 Adapter에서 작성해주어야 합니다.

 

TodoAdapter.kt

class TodoAdapter(val context: Context): RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() {

    ...

    inner class TodoViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {

        ...

        fun onBind(data: Todo) {
            ...

            itemView.setOnClickListener {
                itemClickListner.onClick(it, layoutPosition, list[layoutPosition].id)
            }
        }
    }

    interface ItemClickListener {
        fun onClick(view: View,  position: Int, itemId: Long)
    }

    private lateinit var itemClickListner: ItemClickListener

    fun setItemClickListener(itemClickListener: ItemClickListener) {
        this.itemClickListner = itemClickListener
    }
}

ItemClickListener 함수를 만들어 onBind에서 클릭 감지를 해주도록 하겠습니다.

 

이제 MainActivity로 돌아가 세부 처리를 하도록 하겠습니다.

 

MainActivity.kt

class MainActivity : AppCompatActivity() {
    ...

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        todoAdapter.setItemClickListener(object: TodoAdapter.ItemClickListener {
            override fun onClick(view: View, position: Int, itemId: Long) {
                Toast.makeText(this@MainActivity, "$itemId", Toast.LENGTH_SHORT).show()
                CoroutineScope(Dispatchers.IO).launch {
                    val todo = todoViewModel.getOne(itemId)

                    val intent = Intent(this@MainActivity, EditTodoActivity::class.java).apply {
                        putExtra("type", "EDIT")
                        putExtra("item", todo)
                    }
                    requestActivity.launch(intent)
                }
            }
        })
        
        ...
    }
}

Todo 추가를 할 때는 putExtra에 "ADD"를 담았죠, 이번에는 "EDIT"을 담도록 하겠습니다.

수정이기 때문에 클릭한 아이템의 정보도 모두 Todo 객체로 담아 보내도록 하겠습니다.

 

EditTodoActivity.kt

class EditTodoActivity : AppCompatActivity() {
    ...
    private var todo: Todo?=null

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        val type = intent.getStringExtra("type")

        if (type.equals("ADD")) {
            ...
        } else {
            todo = intent.getSerializableExtra("item") as Todo?
            binding.etTodoTitle.setText(todo!!.title)
            binding.etTodoContent.setText(todo!!.content)
            binding.btnSave.text = "수정하기"
        }

        binding.btnSave.setOnClickListener {
            ...
            
            if (type.equals("ADD")) {
                ...
            } else {
                if (title.isNotEmpty() && content.isNotEmpty()) {
                    val todo = Todo(todo!!.id, title, content, currentDate, todo!!.isChecked)

                    val intent = Intent().apply {
                        putExtra("todo", todo)
                        putExtra("flag", 1)
                    }
                    setResult(RESULT_OK, intent)
                    finish()
                }
            }
        }
    }
}

추가와 달리 이번에는 todo 객체도 받았기 때문에 전달받은 데이터를 토대로 xml의 제목과 내용에 해당 값을 넣어줍니다.

 

그럼 데이터를 하나 추가해 수정해보도록 하겠습니다!

수정을 하고 "수정하기" 버튼을 클릭했을 때,

이번에는 Todo객체에 id를 담아 저장하고 flag는 1로하여 MainActivity로 다시 날려주겠습니다.

 

MainActivity.kt

private val requestActivity = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    if (it.resultCode == RESULT_OK) {
        val todo = it.data?.getSerializableExtra("todo") as Todo

        when(it.data?.getIntExtra("flag", -1)) {
            0 -> {
                ...
            }
            1 -> {
                CoroutineScope(Dispatchers.IO).launch {
                    todoViewModel.update(todo)
                }
                Toast.makeText(this, "수정되었습니다.", Toast.LENGTH_SHORT).show()
            }
        }
    }
}

수정 작업 역시 추가와 마찬가지로 코루틴 스레드를 통해 작업합니다. 

 

정상적으로 수정되었네요!

App Inspection을 통해서도 확인할 수 있을 것입니다.

 

이제 Todo List 가 거의 완성된 것 같군요..!

 

다음시간에는 마지막으로 삭제 기능을 개발해보도록 하겠습니다!

 

 

 

댓글