보통 드로어블은 일단 형식에 맞게 저장이 되어 있다면, R.drawable.파일명 참조로 읽어들일 수 있습니다.
때로는 파일명이 앞부분을 같게 하고 일괄적으로 번호를 붙여 저장하기도 하는데요. 이 경우 R.string이나 R.id로 불가능합니다. 배열에 저장해야 되는데 아래처럼 하면 안됩니다.
1 2 3 4 5 6 7 8 |
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="image1">R.drawable.image1</string> ... <string name="image10">R.drawable.image10</string> </resoruces> |
이것을 코틀린 코드에서 받아내서 루프로 배열에 저장하면 저장된 값은 String이지, R.drawable 참조값이 아니라서 아무런 기능을 못합니다.
대신 TypedArray로 지정해서 가져오는 방법이 있습니다.
1 2 3 4 5 6 7 8 9 10 11 |
<?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="image_array"> <item>@drawable/idols1</item> <item>@drawable/idols2</item> <item>@drawable/idols3</item> <item>@drawable/idols4</item> </string-array> <resources> |
이렇게 지정해두고
1 2 3 4 5 |
var image = resources.obtainTypedArray(R.array.image_array) var _index = image!!.getResourceId(position, -1) view.setImageResource(_index) |
처럼 하면 됩니다. 이코드를 override fun onBindViewHolder(holder: ListHolder, position: Int) 함수처럼 position 값을 넘겨받는 함수에 기재하면 배열로 읽어들인 TypedArray를 R.drawable 참조와 동일하게 써서 처리할 수 있게 됩니다.