본문 바로가기

전체 글

(96)
[Bug / Android] Glide ImageView 깜빡임 해결 🐛 RecyclerView 사용 중, 리스트뷰의 라디오버튼을 클릭할 때마다 리스트 항목들의 이미지뷰가 깜빡이는 현상이 발생 어디서 문제인지 몰라서, 하나씩 체크해봤다 1. Recyclerview setHasStableIds RecyclerView Adapter에 getItemId 선언 후, id를 선언해준다 override fun getItemId(position: Int): Long { return items[position].id.toLong() } onCreateViewHolder 에서 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { setHasStableIds(true) //.....
[Android] viewModels vs activityViewModels (Hilt 사용) ViewModel을 초기화할 때 viewModels()만 사용해봤었는데 activityViewModels의 존재를 알게됐어요 두 가지의 차이점에 대해 알아봅시다! 🔍 왜 이렇게 처음보는게 늘 많은지 T_T 멀고도 험한... viewModels() 해당 ViewModel을 초기화하는 Component의 LifeCycle을 따름 activityViewModels() @MainThread public inline fun Fragment.activityViewModels( noinline extrasProducer: (() -> CreationExtras)? = null, noinline factoryProducer: (() -> Factory)? = null ): Lazy = createVi..
[Android] DataBinding BindingAdapter 사용하기 데이터 바인딩을 사용할 때 view의 attributes를 커스텀으로 추가해 사용할 때 즉, 쉽게 말하자면 xml에서 원하는 속성을 만들어서 사용하는 방식입니다 어떤 속성을 만드는지에 따라서 무궁무진하게 사용됩니다 :) 기본 형태 @BindingAdapter("xml에서 사용할 명칭") fun setAB(속성과 연결된 뷰 타입, T) { // ... } 실제 코드를 보자면 ImageView에 적용하는 예시니, 첫번째 param은 ImageView이고 함수 안에서 사용될 데이터는 String 값임을 알 수 있습니다 @BindingAdapter("setImgUrl") fun setImgUrl(view: ImageView, url: String) { Glide.with(view).load(url).into(v..
[Android] Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.20 (org.jetbrains.kotlin:kotlin-stdlib:1.8.20) and kotlin-stdlib-jdk8-1.7.20 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.20) 🔐 어딘가에서 충돌이나서 생기는 거 같은데, 공식적인 해결방법은 없는 것 같고 구글링하다가 제대로 동작하는 부분을 찾았습니다 :) 하나하나 라이브러리 비교하기에는 무리가 있을 거 같아서 ㅠㅠ 아래의 방법을 따라했습니다 🔑 build.gradle(app)에 아래의 소스를 추가합니다 constraints { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") { because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib") } implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") { because("kotlin-stdlib-jdk8 is n..
[Git , SourceTree] GitHub 토큰 발급하기 , cherrypick 버전관리를 위해 사용하는 Git Git의 GUI 프로그램으로는 SourceTree를 썼다 하지만 나는 여러명이서 소스코드를 같이 관리해본 경험이 없기때문에 배워야할게 많다.. 토큰 발급받기 2021년 하반기 이후로는 토큰을 반드시 사용하도록 변경되었다 Github - 프로필 - settings 선택 Developer Settings 선택 developer settings -> generate new Token (classic) 선택 만료일은 필요한 만큼 정하고 , scope는 전체를 체크했다 ⭐️ 토큰 생성 후 꼭 꼭 꼭 저장해두기 CherryPick 원하는 커밋만 가져오고 싶을 때 예를 들어, feat/a에서 2개를 커밋한 후 첫번째 커밋만 가져오고 싶을 때 1. feat/a 생성 후 2개 커밋 2. ..
[kotlin] 가장 가까운 같은 글자 문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다. 예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다. b는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다. a는 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다. n은 처음 나왔기 때문에 자신의 앞에 같은 글자가 없습니다. 이는 -1로 표현합니다. a는 자신보다 두 칸 앞에 a가 있습니다. 이는 2로 표현합니다. n도 자신보다 두 칸 앞에 n이 있습니다. 이는 2로 표현합니다. a는 자신보다 두 칸, 네 칸 앞에 a가 있습니다. 이..
[Android] Livedata setValue, postvalue Livedata를 쓰면서 setValue, postValue의 차이점을 명확히 모르고 있었다 둘 다 값을 적용하지만 무슨 차이가 있을까? setValue void setValue (T value) 메인쓰레드에서 호출되는 함수, 메인쓰레드에서 값을 바로 변경한다 공식문서에 보면, setValue에 아래와 같이 설명되어있다 If you need set a value from a background thread, you can use postValue(Object) setValue는 메인쓰레드에서 호출되기 때문에, 백그라운드에서 값을 설정하려면 postValue를 사용해야한다 postValue 백그라운드에서 값을 설정하려면 postValue를 사용한다 안드로이드 스튜디오에서 postValue를 눌러보면 아래와..
과일 장수 - kotlin 과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다. 한 상자에 사과를 m개씩 담아 포장합니다. 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다. 과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다) 예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을..