본문 바로가기

Android App 개발

[kotlin] Android Studio 인터페이스 사용 - Adapter와 Activity간의 상호작용 (어댑터뷰 항목의 가격 계산, 총액 구하기)

DAMDA를 만들며 힘들었던 기능 중 하나!!😫

안드로이드 스튜디오에서 어댑터 뷰와 액티비티 속 뷰와 상호작용 시키는 방법과

여러 클래스 내에서 같은 함수를 사용하는 방법은 interface를 사용하는 것이었습니다💨

 

제가 구현하고자 했던 건 adapter view 속의 항목인 price를 모두 더해

activity view의 항목인 total price를 보여주는 것이었는데요,

 

코틀린으로 작성했을 때만 가능한 것인지는 분명하지 않습니다만

인터페이스를 만들어 놓고 activity와 adapter class에서 사용하면 가능했습니다.

Adapter와 Activity간의 상호작용

1) Interface 생성

폴더 선택 후 우클릭으로 New -> Kotlin Class/File 로 생성

사용할 함수 선언

interface CalTotal { fun cal(parameter) }

package com.bluelay.damda

interface CalTotal {
    fun cal(total : String)
}

 

2) Adapter Class에 추가

import 다음 줄 주목!

class Adapter이름(val 변수명 : 인터페이스명) : BaseAdapter() {}

class WishAdapter(val calTotal: CalTotal) : BaseAdapter() {}

package com.bluelay.damda

import ...

class WishAdapter(val calTotal: CalTotal, val context: Context, val wishList: ArrayList<Wish>) : BaseAdapter() {
    var total = 0

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        ...
    }
    
    override fun getCount(): Int {
        return wishList.size
    }

    override fun getItem(position: Int): Any {
        return wishList[position]
    }

    override fun getItemId(position: Int): Long {
        return 0
    }
}      

 

3) Adapter Class내에서 사용

위에서 val 변수명으로 정의해둔 인터페이스.함수명()

calTotal.cal(parameter)

etWishPrice.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
            }

            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                if (s.toString().replace(" ", "") != "") {
                    wish.price = Integer.parseInt(s.toString())
                }
                total = 0
                for (w in wishList) {
                    if (w.price != null) {
                        total += w.price!!
                    }
                }
                calTotal.cal(total.toString())
            }
        })

 

 

4) Activity Class에 추가

위에서 val 변수명으로 정의해둔 인터페이스.함수명()

class 액티비티명 : 인터페이스명

굳이 막 override 쓰면서 타이핑 안해도 빨간줄 누르면 안스가 추가하라고 해주니까 그때 추가하세요

override fun cal(total: String) {}

package com.bluelay.damda

import ...

class WishActivity : AppCompatActivity(), CalTotal, SetMemo {
	...
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_wish)
        ...
    }
    ...

    override fun cal(total: String) {
        tvWishTotal.text = total
    }
}

 

<결과 화면>

/*참고로 TextChangedListener 때문에 입력이 안되는 경우가 있었는데요, Manifest에 

<activity android:name=".WishActivity"
android:windowSoftInputMode="adjustPan"/>

이렇게 키보드 설정을 넣어 해결했습니다.*/

 

github.com/yyj424/DAMDA