월 15,400원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Paging3 적용하지 않고 ProgressBar
강의에서는 PagingAdpater의 addLoadStateListener를 통해 로딩상태를 인식해 프로그래스바를 보여주는데 일반 ListAdapter는 addLoadStateListener 같은 메서드가 없더라고요 ㅠㅠ 일반 ListAdapter 에서 RecyclerView를 그리기 전에 로딩상태를 알아서 프로그래스바를 보여주는 방법은 없을까요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Paging에 관해 질문이 있습니다.
안녕하세요, Paging 강의를 듣고 개인적으로 공부하던 중 궁금한게 생겨서 질문드립니다.강의에서 사용한 카카오 API는 요청 파라미터로 page 값과 size값을 넘겨주고 있는데, 이러한 파라미터가 있기 때문에 retrofit 응답에 Paging을 적용할 수 있는건지 궁금합니다.제가 Paigng을 직접 테스트 해보고 싶어서 mocky.io에서 10000개의 이미지 url을 응답해주는 api를 만든 뒤 강의에서 한 것처럼 페이징을 적용해보았습니다. 그러나 Paging을 안쓴 RecyclerView 응답과 비교했을 때 시간차이가 안납니다. 페이징을 적용하면 매우 빠르게 이미지가 load될 줄 알았는데 그게 안됩니다. 제 지식으로는 이유를 알지 못해 코드를 잘못 짠건지 원래 안되는 api 형식인지 알 수 없어 질문납깁니다.정리하자면, retrofit에 paging을 적용하기 위해선 카카오 api처럼 page나 size를 파라미터로 지정해야하고, is_end등의 response가 있는 통신을 해야 하는 건가요? 단순히 엄청 긴 json응답에 paging을 적용할 수는 없나요?감사합니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
의존성의 문제가 있어도 컴파일 타임에 확인하는 것이 불가능하다는 것의 의미
여러 의존성 라이브러리의 장단점을 찾아보다 보면"컴파일 타임에 문제를 확인할 수 있다""컴파일 타임(Complie Time)에 의존성 주입 코드를 생성해 런타임 성능이 좋다""런 타임(Run Time)에 의존성 주입 코드를 생성해 성능이 좋지 않다"이러한 글들을 볼 수 있는데요컴파일 타임에 의존성 주입 코드를 생성하는 것이 왜 성능이 좋은 것인지?컴파일 타임에 문제를 확인할 수 있다는 것이 왜 장점인지?이 두가지가 궁금합니다!
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
navigation 화면 전환 질문드립니다.
안녕하세요, 우선 질좋은 강의 해주셔서 감사드립니다.다름이 아니라 Search Book 프래그먼트에서 검색어 입력 후 책을 클릭하면 Book Fragment로 이동합니다. 이 상태로 바텀 내비게이션의 Favorite Books 아이콘을 클릭하고 다시 Search Books 아이콘을 클릭하면 바텀 내비게이션 아이콘은 Favorite Books를 클릭한 상태로 보여집니다. 또한 Search Book Fragment를 보여줘야 할 것 같은데 여전히 클릭한 Book Fragment를 보여주고 있습니다.어떻게 해결해야 할까요?정리하자면, Book Fragment에 들어간 상태에서 BottomNavigationView의 Favorite Books 아이콘 클릭 후 다시 Search Books 아이콘을 클릭하면 이상하게 동작합니다. Search Books Fragment가 실행되게 하고 싶습니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
소스 깃허브에 올려도 되나요? (라이센스 문의)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 자유 주제에 블로그 저작권 관련한 내용은 봤습니다.블로그에 올릴 건 아니고,해당 강의 실습 한 거, 깃허브 public 레포지토리로, Today i leared으로 올려도 괜찮은가요?소스에 대게 아파치2.0라이센스가 걸어두신거 같은데, 아파치가 어떻게 적용되는지 정확하게 잘 모르기도 해서.. 한번 여쭤보려고 질문 올립니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Pager 관련 질문입니다!
해당 강의가 너무 도움이 되어!! 다른 카카오 오픈 api를 통해 다른 어플을 개발하고 있습니다!다만 다음 부분에서 이해가 덜 되어 에러가 발생하고 있습니다!제가 연결하고 있는 api의 page(결과 페이지 번호)는 최대 45, size(한 페이지당 보여질 문서의 개수)는 최대 15여서 다음과 같이 설정하였으나, load 부분에서 params.loadSize 가 계속 45가 나와 최대 사이즈를 초과했다는 에러가 발생합니다 override fun searchPagingFood(query: String): Flow<PagingData<Restaurant>> { val pagingSourceFactory = { SearchFoodPagingSource(query)} return Pager( config = PagingConfig( pageSize = PAGING_SIZE, //15 enablePlaceholders = false, maxSize = PAGING_SIZE * 3 //15 * 3 ), pagingSourceFactory = pagingSourceFactory ).flow }val response = SearchFoodApi.create().searchFood( query, "FD6, CE7", "126.923460283882", "37.5803504797164", 10000, pageNumber, params.loadSize )책 검색 api와 똑같은 개념이지만, page와 size의 단위가 달라 헷갈립니다!!이럴 경우에는 pageSize와 maxSize를 어떤 범위로 설정하고, 왜 계속 params.loadSize가 45가 나오는지 이해가 되지 않습니다!!page의 최대값은 45이고, size는 최대값이 15입니다.어떻게 설정해야하는지 알려주시면 감사하겠습니다 ㅠㅠㅠㅠㅠㅠ
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
디자인 패턴 질문
안녕하세요 냉동코더님보강이론 전 책 검색 만들기까지 수강하였는데요,영상에서 제작한 책 검색 어플은 MVVM패턴으로 제작한 거로 알고있는데 디자인패턴을 적용하지 않고 개발하였을경우에 따로 부르는 명칭이 있나요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
ViewModel이 RepositoryImpl이 아니라 Repository를 생성자로 가지고 있는 것에 대한 질문
제목 그대로 ViewModel이 RepositoryImpl(구현체)이 아니라 Repository(인터페이스)를 생성자로 가지고 있는 것은 SOLID 원칙 중 어느 원칙을 준수하기 위함인지가 궁금합니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
compose 에 관하여 질문드립니다.
강의 내용과는 상관없지만, 그냥 궁금증이 들어 질문드립니다.최근 구글 i/o를보면 composable 한 코딩에 굉장히 힘을 실어주고 있다는 느낌을 받았는데요.공부하는 학생의 입장에서는 공부할거리가 늘어 부담? 이 되는 상황인데, 현직자의 입장에서 현업에서 현재 composable한 함수로 리팩토링을 하고있는지 궁금합니다.이쪽업계에서 일을 하고 싶다면 공부를 하는편이 더 좋을까요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
테스트 커버리지 관련 질문
안드로이드 경력개발자 분들의 이력서 혹은 기술 블로그를 보다보면 ~~앱의 테스트 커버리지를 60%를 달성했다 이런 글을 볼 수 있는데 테스트 커버리지를 측정하는 도구나 라이브러리가 제공되나요? 측정하는 방법이 궁금합니다!
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
리사이클러뷰 아이템 클릭 관련해서 질문이 있습니다!
리사이클러뷰 아이템에서 클릭했을 때 override fun onBindViewHolder(holder: BookSearchViewGridHolder, position: Int) { val book = currentList[position] holder.bind(book) holder.itemView.setOnClickListener { onItemClickListener?.let{ it(book) } } } private var onItemClickListener : ((Book) -> Unit)? = null fun setOnItemClickListener(listener : (Book) -> Unit){ onItemClickListener = listener }강의대로 위와 같이 해주었습니다. 다만 아이템안의 특정요소, 예를 들어 각 아이템에서 사진을 클릭했을 때 특정 로직을 실행하고 싶을 때 그러한 경우는 어떤식으로 코드를 짜야할지 궁금합니다!아이템에서 사진을 클릭했을 때 프래그먼트에서 특정로직을 실행하고 싶습니다!!
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Prodeuction 코드 내에 Test 용도의 코드에 관한 질문
안녕하세요 냉동코더님! 처음으로 Test코드에 대한 내용을 학습하다 보니 궁금한 점이 많네요 궁금한 점이 프로덕션코드의 내에 즉 영상에서 보면 BookViewModel 내부에 Test용 코드를 넣는걸 볼 수 있는데 이렇게 프로덕션 코드 내에 Test용 코드를 넣어도 괜찮은 건가요?// For Test val favoriteBooks: Flow<List<Book>> = bookSearchRepository.getFavoriteBooks()
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Truth, Hancrust 관련 질문
Assertion (역설)에 필요한 라이브러리 소개해주실 때 Truth와 Hancrust를 소개해주셨는데 왜 의존성에는 2개를 다 추가하신건가요??? 둘 중 하나만 필요한 것이 아닌가요? ㅠㅠ그리고 만약 Truth를 선택하셨다면 이 라이브러리를 선택하신 이유가 있으실까요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
뷰바인딩 null 질문
안녕하세요강의를 듣다 궁금한 것이 생겨 질문 드립니다private var _binding: FragmentFirstBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!!코드에서 binding 변수는 게터함수호출시 옵셔널을 벗기는데,override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentFirstBinding.inflate(inflater, container, false) return binding.root }에서는 _binding 변수에 만약 null값이 들어올 경우는 없나요?null 값이 들어왔다면 리턴값은 어떻게 되나요?
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
RV 관련하여 질문드립니다.
안녕하십니까, 강사님 좋은 강의 너무 잘 듣고 있습니다.단순히 따라하는 것 보다 제가 여러 기능들을 추가하고 있는데요,관심목록에 있는 책 들의 가격의 합을 RV밑에 출력해주려고 합니다.그래서 다음과 같이 변경하였습니다.<androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_favorite_books" android:layout_width="0dp" android:layout_height="wrap_content" android:scrollbars="vertical" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/favorite_sum_price" android:text="SUMPRICE" android:textSize="20sp" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_constraintTop_toBottomOf="@id/rv_favorite_books" app:layout_constraintRight_toRightOf="parent"/>rv 밑에 총 가격을 담아주고 위와 같이 설정해주었습니다.하지만 rv부분에 item들은 출력이 되지 않고, 가격만 출력되고 있습니다.이게 혹시 paging관련해서 잘못된 것인지, rv부분의 height를 0dp로 바꾸면 잘 나오긴 합니다..
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
BookSearchRepository 관련 질문
BookSearchRepository interface 부분과 BookSearchRepository 구현부를 구현한건 검색 결과를 받아오기위해서인거 같은데 설명이 간략해서 잘 이해사 안갑니다 ㅠㅠ왜 interface를 생겅하고 구현하는지도... interface 는 한 기능을 여러 class 에서 메소드name 를 공통되게 쓰고싶을때 구현하는게 아닌가요 ㅠㅠ? 왜 1:1 로 사용하는지 궁급합니다.
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
Fragment in Fragment
acticity_main.xml 에서 FrameLayout 과 BottomNavigationView 영역을 나눴잖아요?그런데 BottomNavigationView 을 이용해서 Fragment 를 1, 2, 3 개를 연결해줬을때 어떻게 BottomNavigationView 영역을 제외하고 FrameLayout 영역에 Fragment 가 알맞게 크기를 찾아가는지 갑자기 궁금해져서 질문드려요 ㅠㅠ
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
도큐먼크 클래스 생성관련
전 보다싶이 변수 위에 @Json 어노테이션이 다 붙어있습니다.강의와 왜 다른걸까요 ㅠㅠ지워야하나요? 그리고 @field : Json 형태로 수정하기에 개수가 많은데 같은 변수? 글자 를 동시에 변경할수 있는 단축키가 있나요? @Json(name = "authors") val authors: List<String> package com.nowornaver.booksearchapp.data.model import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) data class Document( @Json(name = "authors") val authors: List<String>, @Json(name = "contents") val contents: String, @Json(name = "datetime") val datetime: String, @Json(name = "isbn") val isbn: String, @Json(name = "price") val price: Int, @Json(name = "publisher") val publisher: String, @Json(name = "sale_price") val salePrice: Int, @Json(name = "status") val status: String, @Json(name = "thumbnail") val thumbnail: String, @Json(name = "title") val title: String, @Json(name = "translators") val translators: List<String>, @Json(name = "url") val url: String )
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
의존성 주입 관련해서 질문이 있습니다!
원래는 Factory를 통해 repository 등 viewmodel에서 사용할 것들을 전달해 주었습니다!원래 했던 프로젝트에서도 다음과 같이 프래그먼트에서 viewmodel을 다음과 같이 선언하여 팩토리를 넘겨주어 구현했었습니다. private val viewModel: BoardDetailViewModel by viewModels { BoardViewModelFactory() }이제 의존성주입을 공부하고 있어 실제 프로젝트에서도 적용해보려고 하는데, 궁금한 점이 있어 글을 작성합니다.만일 이번 강의와 같이 의존성주입을 하게되면 ViewModel에 있는 Repository를 위와 같이 팩토리를 통해 전달하지 않고 다음과 같이 적어줘도 실행되는 이유가 무엇인가요?private val bookViewModel by viewModels<BookViewModel>()분명히 BookViewModel에는 Repository를 생성자로 받으라고 나와있는데, 위에 저렇게만 적어줘도 실행되는 이유가 궁금합니다! 아직 의존성주입에 대해 이해를 못했는지... 잘 이해가 가지 않습니다!항상 좋은 강의 감사드립니다 :)
- 미해결냉동코더의 알기 쉬운 Modern Android Development 입문
binding or 프레그먼트 기본 구조가 이해가안가서 질문드립니다
private var _binding: FragmentSearchBinding? = null private val binding get() = binding!!부분에서 binding 을 인식하고 라고하셨는데 질문 1._binding 의 값은 밑에 get() = binding!! 부분에서 받아 오는(인식하는) 건가요?질문 2.override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentSearchBinding.inflate(inflater, container, false) return binding.root }이 부분소스 구동이 잘 이해가 안가서 ㅠㅠ 생명주기에 의해서 onCreateView 는 View 를 상속 받는데 _binding = FragmentSearchBinding.inflate(inflater, container, false 파라미터를 받고 binding root를 반환(지정)해주는건가요? // 죄송합니다 ㅠㅠ 이부분이 잘 이해가안가서..