전체 글 112

TroubleShooting With AppbarLayout expand

요구조건 1. 아래로 스크롤시 툴바가 투명해지면서 오른쪽에 썸네일이 보임 2. 아래로 스크롤시 탑으로 가는 버튼 생성 -> 탑으로 이동 3. 스크롤시 탭 레이아웃이 툴바 밑에 고정 상품 상세화면 구조 샘플 ... private val appBarOnOffScrollListener: AppBarLayout.OnOffsetChangedListener by lazy { AppBarLayout.OnOffsetChangedListener { _, verticalOffset -> with(viewDataBinding) { if (ctlLayout.height + verticalOffset < 2 * ViewCompat.getMinimumHeight(ctlLayout)) { // collapsed (아래로 스크롤 했..

Android 2021.06.06

상품리스트 - 좋아요 - 툴팁 - 트러블 슈팅

환경 : MVVM + 리사이클러뷰 + 데이터바인딩 + DiffUtil 요구 조건 : 상품 리스트에서 좋아요를 눌렀을때 툴팁이 2초동안 보이게 해주세요! - 툴팁 보여주기 animate() 를 이용 tvTooltip.apply { alpha = 1f animate() .alpha(1f) .setDuration(2_000L) .setListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator?) { alpha = 0f } }) } 처음에 툴팁 TextView의 alpha 값을 0으로 설정후 좋아요 버튼을 누르면 alpha: 1로 변경, 2초후에 alpha: 0으로 변경 구현 좋아요 버튼 클릭 -> Vi..

Android 2021.06.05

비동기 함수 - Rx로 변경하기

1. Single ( 한번 받기 ) 예제 : FirebaseMessage의 token 받기 기본 var token : String fun getInstanceId(){ Firebase.messaging.token .addOnCompleteListener { token = it.result } } 이렇게 하면 함수형이 아니게 된다. 그래서 Single.create로 변환 override fun getInstanceId(): Single { return Single.create { emitter -> Firebase.messaging.token .addOnCompleteListener { task -> when (task.isSuccessful) { true -> task.result?.let { emitt..

Android 2021.05.14

웹뷰 스크롤 전파

CoordinatorLayout -> ViewPager -> Fragment 가 웹뷰를 가지고 있다. 그러면 웹뷰를 스크롤하면 ViewPager의 app:layout_behavior="@string/appbar_scrolling_view_behavior" 이 동작하지 않는다. (단지 웹뷰만 스크롤 될뿐이다.) 그래서 웹뷰가 스크롤될때 상황에 따라 상위 뷰에 전파하기 가 필요하다 아래의 코드는 NestedScrollWebView 라이브러리를 커스텀 했다 (NestedScrollingChild3 로 변형하여 ) 웹뷰 프레그먼트 레이아웃 class NestedScrollWebView @JvmOverloads constructor( context: Context?, attrs: AttributeSet? = nu..

Android 2021.04.03

Map vs FlatMap

리스트 변환 연산자 map 과 flatMap의 차이와 활용 방법에 대한 정리 (1) map : iterator()로 각 아이템 꺼내옴 -> 변형 -> 방출 (2) flatMap : iterator() 로 아이템 하나씩 꺼내옴 -> 새로운 리스트로 변형 -> 방출 map은 익히 알고 있는 for문과 동일하기 때문에 이해하기 쉬운데 flatMap은 문서만 보고선 도저히 이해하기 어렵다. ( 개념이 와닿지가 않는다. flat하게 만든다는게 무슨말이지? ) 실 예로 flatMap 이해하기 1. 리스트 2배로 변형 fun main() { val list = listOf( Cat(1, "naong"), Cat(2, "persian"), Cat(3, "sham") ) //고양이 2배로 증식하기 val new = li..

Android 2021.04.01

Data class + DiffUtil 이슈

기본적으로 코틀린의 data class는 모든 속성들에 대해 equals()와 hashCode()가 정의 되어있다. 따라서 ListAdapter의 DiffUtil에서 내부적으로 객체를 비교할때 해당 속성의 값들중 하나라도 변화가 있는 경우 (문제 상황) - EditText 에 입력하는 값 : inputText - - EditText 에 입력할때마다 onTextChanged를 받아서 리스트의 모델을 변경하는 구조 - EditText에 한글자씩 칠때마다 -> 리스트의 모델이 변경 -> inputText가 다시 적용 -> 키보드가 매번 내려감(EditText 포커스를 잃음) (해결 방법) equals() 와 hashCode()에서 inputText 를 지워야 한다. inputText 를 제외하고 오버라이딩 해..

Android 2021.03.25

알고리즘 연습

Q. 리스트항목중 최대값과 최소값의 차이가 가장 큰 항목의 인덱스 구하기 A. a에서는 a[2]의 차이가 10으로 가장 크므로 2가 출력되어야함 val a = listOf( listOf(1, 1), listOf(6, 3), listOf(9, 19) ) 1번 방법 var maxIndex = 0 var maxDifference = 0 a.forEachIndexed { index, item -> val difference = item.max()!! - item.min()!! if (difference > maxDifference) { maxIndex = index maxDifference = difference } } maxIndex 2번 방법 a.indexOf(a.maxBy { it.max()!! - it...

카테고리 없음 2021.03.08