Skip to content

Level2 1주차 왕감자 스터디 #1

Description

@jerry8282

📱 Android View 및 Adapter 관련 정리

📏 View 크기 단위

sp: 디바이스 글자 크기 설정 변경에 대응 가능 (사용자 접근성 고려)

🎨 어노테이션

@drawable: 해당 변수/파라미터에 다른 타입이 들어오는 것을 방지

🧠 Adapter 관련

getItemId는 왜 Long을 반환할까?

  • Int보다 더 넓은 범위를 표현할 수 있음 → 대규모 데이터셋 대비

getView() 메서드 구현

override fun getView(
    position: Int,
    convertView: View?,
    parent: ViewGroup?,
): View {
    val view = convertView ?: LayoutInflater
        .from(parent?.context)
        .inflate(R.layout.item_movie, parent, false)
    return view
}
  • false인 이유?
    → attachToRoot = false: 레이아웃을 바로 부모 뷰에 붙이지 않고 반환만 함
  • 왜 parent의 context를 가져오는가?
    → parent는 ListView나 RecyclerView. 이 context를 통해 스타일 등 상속 가능

🔍 View 찾기 - 타입 추론

val imageView: ImageView = view.findViewById(R.id.poster)
val imageView = view.findViewById<ImageView>(R.id.poster)
  • 두 방식 모두 동일한 결과 (타입 추론 여부만 차이)
  • 성능 차이는 없음
  • 제네릭은 런타임 시 타입 소거됨 → 타입 추론은 컴파일 타임에 이뤄짐

🖱️ 리스트 아이템 클릭 처리

listView.setOnItemClickListener { _, _, position, _ ->
    // ...
}

void onItemClick(AdapterView<?> parent, View view, int position, long id);

  • parent: 이벤트가 발생한 ListView or RecyclerView

📦 Intent가 null일 경우

  • 원래는 null이 될 일이 없어야 함
  • 만약 null이라면?
    • 오류 안내 후 이전 화면으로 보내기
    • 또는 기본값 처리 / 로딩 상태 (뱅글뱅글) 도 고려 가능

📦 Parcelable

  • Kotlin 전용 Parcelable 도구 존재 (e.g. @parcelize)

🔄 회전 시 상태 복원

  • onRestoreInstanceState(Bundle savedInstanceState) 사용 시
    → 저장된 상태가 있을 때만 호출되므로 null 체크 불필요
  • 회전 테스트 방법:
    activity.requestOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE

🔧 Android Studio Tools

  • Tools → Profiler → View Live Telemetry
    → 실시간 View 상태 확인 가능

⚡ View 재사용 & 최적화

ConvertView

  • View 껍데기를 재사용하여 성능 향상

ViewHolder 패턴

  • findViewById 호출 최소화

🎬 도메인 설계 고민

data class Movie(
    val posterResId: Int,
    val title: String,
    val screeningPeriod: ScreeningPeriod,
    val runningTime: Int,
) : Serializable
  • 이미지 URI를 받게 될 경우:
    • 도메인 레이어에서 이미지 경로를 다루는 것이 적절한가?
    • 해결 방향:
      • 원시값 포장
      • 도메인과 분리된 UI 전용 모델 사용

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions