Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Team04] Stitch&스타크 - 네트워크 통신 및 드래그 앤 드롭, 스와이프 구현 - 최종 PR #210

Open
wants to merge 32 commits into
base: team-04
Choose a base branch
from

Conversation

jminie-o8o
Copy link

구현 상황

  • 팝업 메뉴를 리스트 아이템에 연결

    • 메뉴는 3가지로 구성 (완료한 일로 이동, 수정하기, 삭제하기)
  • 서버와 네트워크 통신 구현

    • Retrofit2, Coroutine, Gson 사용
    • 응답 객체 관리를 위한 Result.Success, Result.Error 구현
    • 모든 카드 조회
    • 모든 기록(History) 조회
    • 카드 추가
    • 카드 수정
    • 카드 삭제
      • 스와이프를 이용한 삭제, 팝업 메뉴를 이용한 삭제
  • 드래그 앤 드롭, 스와이프 구현

    • ItemTouchHelper 로 RecyclerView 내에 드래그 앤 드롭, 스와이프 구현
    • 리사이클러뷰들 간의 드래그 앤 드롭을 위해 ItemTouchHelper 의 onMove 메서드를 구현을 제거하고 DragListener 로 구현

질문

 private val _todoTask = MutableLiveData<MutableList<TaskDetailResponse>>()
    val todoTask: LiveData<MutableList<TaskDetailResponse>>
        get() = _todoTask
...
...

val tasks = taskRemoteRepository.loadTask()
_todoTask.value.add = tasks.data.todo

위와 같이 직접 LiveData에 add를 시키는 경우 LiveData에 데이터가 추가되지 않고

 private var todoItem: MutableList<TaskDetailResponse> = mutableListOf()
 private val _todoTask = MutableLiveData<MutableList<TaskDetailResponse>>()
    val todoTask: LiveData<MutableList<TaskDetailResponse>>
        get() = _todoTask
...
...

val tasks = taskRemoteRepository.loadTask()
todoItem = tasks.data.todo
_todoTask.value = todoItem

이런식으로 새로운 MutableList를 만든 후 MutableLiveData에 동기화 하는 방법으로 구현했을 때만 정상적으로 LiveData에 데이터가 추가되는 경험을 했습니다.
해당 부분의 이유가 궁금합니다.

Screenshot

2022-04-15.3.33.59.mov

taewooyo and others added 30 commits April 11, 2022 13:23
[Android] Stitch - 리사이클러 뷰 목록 팝업메뉴 연결, 메뉴 별 기능 구현
…e-#39

[Android] 스타크 - 레트로핏 카드 저장, 조희, 수정 기능 구현
[Android] stitch - drag&drop&swipe 기능 구현
[Android] Stitch&스타크 - 2주차 수요일 피드백
[Android] Stitch - 카드 모든 조회 네트워크 통신
[Android] 스타크 - 추가 수정 네트워크 통신 구현
[Android] Stitch - 모든 활동 로그기록(history) 네트워크 통신
[Android] Stitch - task 삭제 네트워크 통신
[Android] Stitch - Task 이동하기 네트워크 통신 기능 구현
@jminie-o8o jminie-o8o changed the title Test android [Team04] Stitch&스타크 - 네트워크 통신 및 드래그 앤 드롭, 스와이프 구현 - 최종 PR Apr 15, 2022
@hwicode hwicode added the review-android Further information is requested label Apr 15, 2022
@taewooyo
Copy link

@renovatio0424 스타크와 스티치와 같이 진행했습니다. drag&drop&swipe, 네트워크 책임과 분리에 대해 따끔한 채찍 부탁드립니다.

@renovatio0424
Copy link

질문

이런식으로 새로운 MutableList를 만든 후 MutableLiveData에 동기화 하는 방법으로 구현했을 때만 정상적으로 LiveData에 데이터가 추가되는 경험을 했습니다.
해당 부분의 이유가 궁금합니다.

답변

좋은 질문이네요 ㅎㅎ
이런 경우에는 구현체를 확인해보시는게 좋아요
MutableLiveData 내부에 어떻게 구현이 되어있는지 보면 알 수 있을 것 같네요 ㅎㅎ
혹시 내부 구현 코드를 보고도 이해가 안된다면 DM 주세요~

Comment on lines -7 to 10
fun String.htmlToString() : String {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY).toString()
} else {
Html.fromHtml(this).toString()
}
fun String.htmlToSpanned() : Spanned {
return HtmlCompat.fromHtml(this, FROM_HTML_MODE_LEGACY)
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 버전 분기 코드를 개선했군요!
좋습니다~
xxxCompat 클래스들이 버전 분기 처리를 해주느니 기억해두면 좋겠네요~

val createData: String,
val createDateTime: String,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

네이밍 개선 좋습니다~

Comment on lines +3 to +6
sealed class Result<out T : Any> {
data class Success<out T : Any>(val data: T) : Result<T>()
data class Error(val error: String) : Result<Nothing>()
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sealed class 를 사용했네요 ??
sealed class 를 사용했던 이유가 무엇인가요?

import retrofit2.converter.gson.GsonConverterFactory

object RetrofitAPI {
private const val BASE_URL = "http://www.louie-03.com/"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https 를 사용하지 않고 http 를 사용했던 이유가 무엇인가요?

import androidx.recyclerview.widget.RecyclerView
import com.example.todolist.R

class DragListener : View.OnDragListener {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DragListener 이름만 보았을땐 모든 DragEvent 를 핸들링해줄 수 있는 Listener 같네요
이렇게 네이밍과 실제 구현체의 동작이 다르면 혼동을 일으킬 수 있어요 ㅎㅎ
이럴땐 같이 작업하는 팀원들과 어떻게 하면 혼동이 되지 않을지 이야기해보면 좋겠네요 ㅎㅎ

import kotlin.math.max
import kotlin.math.min

class ItemTouchCallback(private var clamp: Float) : ItemTouchHelper.Callback() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

DragListener와 마찬가지네요 ㅎㅎ

Comment on lines +5 to +13
interface ItemTouchHelperListener {
fun onItemMove(fromPosition: Int, toPosition: Int): Boolean

fun onItemSwipe(position: Int)

fun add(type: Int, index: Int, task: TaskDetailResponse)

fun remove(index: Int, task: TaskDetailResponse)
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

인터페이스 구현으로 미리 api 구조를 설계하는 게 좋네요 ㅎㅎ
미리 설계하고 만드는 것도 좋지만 만들어진 클래스들을의 공통 API 를 뽑아 인터페이스를 만들어보는것도 연습해보시면 도움이 많이 되실거에요 ㅎㅎ

Copy link

@renovatio0424 renovatio0424 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리뷰 확인해주세요~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
review-android Further information is requested
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants