wafflestudio / seminar-2020

2020 Rookies 세미나
28 stars 49 forks source link

addTodo를 해도 실제 app 화면에 표시되지 않습니다. #198

Open tictactoeid opened 4 years ago

tictactoeid commented 4 years ago

HW2 수행하던 중 질문이 있습니다. 현재 앱을 실행하여 todo 추가 버튼을 누르고, 제목과 내용을 입력한 뒤 create를 누르면 create라는 내용의 toast는 표시되지만, todo가 app 메인 화면에 표시되지 않습니다.

사실 제가 전반적으로 이해가 부족합니다. codelab 등을 보고 먼저 공부하는 것이 맞겠지만, 과제를 수행해야 다음 seminar에도 참여할 수 있으므로 우선 세미나 중 보여주신 코드와 예시 코드(roomexample의 memo 코드)를 참고하여 우선 TODO를 모두 완료하기는 했습니다만, 어디에 문제가 있어서 화면에 표시되지 않는지 모르겠습니다.

그나마 의심가는 부분은 TodoListAdapter.kt의

class TodoViewHolder(private val binding: ItemTodoBinding, private val viewModel: TodoViewModel) : RecyclerView.ViewHolder(binding.root) {
    fun bindTodo(todo: Todo) {
        binding.item = todo
    }
}

입니다. 의심하고 있는 이유는 private val viewModel을 skeleton code에서 선언하기는 하였지만 제가 사용하지 않았다는 점 때문입니다만, 사실 이게 원인이 맞는지, 어떻게 사용해야 하는지/사용할 필요가 없는지 등 감이 잡히지 않는 부분이 많아 우선 issue에 올려봅니다.

sanggggg commented 4 years ago

단순 안 뜨는 이유는 너무 많을 것 같네요... 디비에 입력이 되지않는케이스도 있고, livedata fetch가 실패한 경우도 있고... 코드 전체를 푸쉬해서 공유해주셔야 문제점을 알 수 있을 것 같네요

sanggggg commented 4 years ago

ViewHolder 의 저 코드는 binding의 variable을 넘겨주는 용도입니다. 저걸 사용하는 건 xml에서 해당 데이터를 view와 연결하는 방식으로 사용해야 할 것 같습니다. 아이템이 보이지 않는 것과는 상관이 없을 것으로 예상되네요 (아이템의 titile content가 이상하게 표기되는 부분과 관련이 있는 코드입니다)

tictactoeid commented 4 years ago

과제 제출하는 waffle-android-assign repository에 코드 업로드해두었습니다. 문제가 무엇인지는 저도 계속 찾아보겠습니다. 감사합니다.

sanggggg commented 4 years ago

코드 확인했습니다. 우선 의심되는 부분은

@BindingAdapter("items")
fun bindItems(view: RecyclerView, todo: List<Todo>) { // List<Todo>?
    val adapter = view.adapter as? TodoListAdapter
    adapter?.setItems(todo)
}

입니다 주석으로 의문을 표하셨듯이 todo는 LiveData<List<Todo>> Type 의 value 가 인자로 들어오는데 얘는 타입이 List<Todo>? 입니다. 따라서 인자로 nullable 한 List<Todo>? 를 받아야 할 것 같네요

sanggggg commented 4 years ago

더 중요한 문제가 있네요... activity_main.xml 에서

<androidx.recyclerview.widget.RecyclerView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:adapter="@{adapter}"
                app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
                tools:layout_editor_absoluteX="-26dp"
                tools:layout_editor_absoluteY="16dp"
                tools:listitem="@layout/item_todo" />

저희가 위에서 items BindingAdapter를 만들었고 얘가 사용되는 곳은, xml 에 viewModel 의 todos 랑 바인딩 하는 것입니다. 따라서 app:items=@{viewModel.allTodos} 를 추가해줘야 할 것 같네요

sanggggg commented 4 years ago

전반적으로 코드를 이해하고 작성하는 느낌이 부족한 것 같습니다 ㅠㅠ 이렇게 세미나 과제를 완료 해도 결국 이후의 과제나 프로젝트를 진행할 때는 꼭 코드를 적었다면 왜 적었는지 제대로 배우고 써야하기 때문에 확실히 Codelab 을 통해 복습하는 걸 권장드립니다

tictactoeid commented 4 years ago

답변 감사합니다! 우선 질문한 부분은 해결되었습니다. 과제를 수행하는 것 자체는 어느 정도 한 것 같으니, 추석 이용해서 codelab으로 복습하고 과제를 다시 수행해 보는 것도 괜찮을 것 같습니다.