Custom ListView
- ListView의 Item을 보여주기 위해서 기본적으로 안드로이드에서 제공하는 simple_list_item_1 을 사용
- 해당 layout을 사용자가 custom 하여 item을 다양한 스타일로 보여주는 것
- 사용자가 커스텀한 layout xml 파일과 해당 layout을 지정하여 adapter class
* 이 포스팅에서는 하나의 항목에 나타나는 데이터를 사용자가 직접 커스텀하는 방법을 다루기 때문에 adapter class는 ArrayAdapter 와 simpleAdapter를 사용한다.
Adapter Class1 (하나의 뷰를 한 항목에 셋팅)
- Adapter Class 객체를 생성할 때 파라미터 조정 필요
val adapter = ArrayAdapter(this, R.layout.row, R.id.rowTextView, data1)
- 첫번째 파라미터 : context
- 두번째 파라미터 : 사용자가 원하는 스타일로 item 을 보여주기 위해 커스텀한 layout
- 세번째 파라미터 : 커스텀 layout에서 항목별로 데이터를 보여줄 뷰의 id (ex. textview, imageview)
- 네번째 파라미터 : 보여줄 데이터 배열
class MainActivity : AppCompatActivity() {
val mainBinding : MainActivityBinding = new MainActivityBinding()
val data1 = arrayof("문자열1","문자열2","문자열3","문자열4","문자열5")
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
setContentView()
//Adater Class 파라미터 조정
val adapter1 = ArrayAdapter(this, R.layout.row, R.id.rowTextView, data1)
mainBinding.list1.adapter = adapter1 //activity 위에 listview를 넣고 그 listview의 adapter를 설정
}
Adapter Class2 (다수의 뷰를 한 항목에 셋팅)
val adapter = SimpleAdapter(this, dataList, R.layout.row, keys, ids)
- 첫번째 파라미터 : context
- 두번째 파라미터 : 보여줄 데이터 배열
- 세번째 파라미터 : 사용자가 원하는 스타일로 item 을 보여주기 위해 커스텀한 layout
- 네번째 파라미터 : 데이터 배열에 저장한 value를 꺼내기 위한 key 값 배열
- 다섯번째 파라미터 : 커스텀한 layout에서 항목별로 데이터를 보여줄 view의 id
class MainActivity : AppCompatActivity() {
val mainBinding : MainActivityBinding = new MainActivityBinding()
val data1 = arrayof("토고","프랑스어","스위스","스페인","독일")
val data2 = arrayOf("togo", "france", "swiss", "spain", "german")
override fun onCreate(savedInstanceState : Bundle?) {
super.onCreate(savedInstanceState)
setContentView()
val dataList = ArrayList<HashMap<String, any>>()
for(i in imgRes.indices){
val map = HashMap<String, Any>() // HashMap 원소 하나가 이미지1개,문자열2개 로 구성
map["img"] = imgRes[i]
map["data1"] = data1[i]
map["data2"] = data2[i]
dataList.add(map)
}
//HashMap에 데이터를 저장했을 때 사용했던 이름 배열
val keys = arrayOf("img", "data1", "data2") // dataList에서 map의 key
val ids = inArrayOf(R.id.rowImageView, R.id.rowTexteView1, R.id.rowTexteView2) //view id
/*
* dataList에 있는 HashMap 데이터에서
* keys를 key값으로 하여 vlaue를 불러오고
* value는 사용자가 커스텀한 레이아웃 row에 존재하는 뷰에 배치됨.
* 그리고 그 뷰가 무엇인지는 ids 배열에 지정되어 있음
*/
//Adapter Class
val adapter1 = SimpleAdapter(this, dataList, R.layout.row, keys, ids)
mainBinding.list1.adapter = adapter1
// 람다식을 이용한 리스너 구현(어차피 오버라이딩할 메소드 1개임)
mainBinding.list1.setOnItemClickListener { parent, view, position, id ->
// 첫번째 : 이벤트가 발생한 항목을 가지고 있는 adapterview
// 두번째 : 이벤트가 발생한 항목 view
// 세번째 : 이벤트가 발생한 항목의 index
mainBinding.textView.text = "${data1[position]} 항목을 터치하였습니다."
// ex.토고 항목을 터치하였습니다.
}
}
- dataList(리스트)는 이미지1개와 문자열 2개로 구성된 HashMap 배열
- 커스텀 한 레이아웃에는 이미지1개와 텍스트2개에 대한 view가 존재, ids 배열에는 view에 대한 id 정보가 존재
- keys 배열에 정의해놓은 key 값으로 dataList-HashMap 의 value를 불러오고 value는 ids 배열의 view id와 1대1 매칭
(어떤 데이터가 어떤 view에 들어갈지 명시해 놓은것)
https://sunnybong.tistory.com/156
'Android' 카테고리의 다른 글
[안드로이드/Widget] 다양한 view/widget & 사용법 (0) | 2023.02.20 |
---|---|
[안드로이드/Style] 색상 지정 (0) | 2022.09.15 |
[안드로이드/AdapterView] AdapterView의 개념과 ListView, GridView (0) | 2022.09.13 |
[안드로이드/Layout] Layout의 개념/종류 (0) | 2022.09.06 |
[안드로이드/View] View Binding (0) | 2022.09.06 |