개발자의 데이터 설정으로 화면을 구성하는 view
Adapter Class
view를 구성하기 위해 설정해야하는 데이터를 관리하는 Class
- 사용 목적이나 적용할 view에 따라 다양하게 제공
- 직접 생성 가능
사용자가 정의한 데이터 목록을 아이템 단위로 구성하여 화면에 출력하는 ViewGroup
- Context, 항목 1개를 구성할 레이아웃, 텍스트뷰에 채워줄 문자열 배열
- context : 어떠한 작업을 위해 정보를 관리하는 요소
* 안드로이드는 시스템이나 애플리케이션과 관련된 정보val adapter = ArrayAdapter<String>( // this = MainActivity this, android.R.layout.simple_list_item_1, data1 ) listView.run{ setAdapter(adapter) }
- Context, 항목 1개를 구성할 레이아웃, layout 파일 내 문자열을 설정할 View ID, 텍스트뷰에 채워줄 문자열 배열
listView.run{ adapter = ArrayAdapter<String>( this@MainActivity, R.layout.row, R.id.textView2, data1 ) }
activityMainBinding.run{
listView.run{
setAdapter(adapter)
setOnItemClickListener { parent, view, position, id ->
textView.text = "${data1[position]} 클릭"
}
}
}
문자열 1개를 설정하는 경우
val adapter = ArrayAdapter<String>(
// this = MainActivity
this, android.R.layout.simple_list_item_1, data1
)
activityMainBinding.run{
listView.run{
setAdapter(adapter)
}
}
val adapter = listView.adapter as ArrayAdapter<String>
adapter.notifyDataSetChanged()
val rowList = mutableListOf<String>()
activityMainBinding.run{
listView.run{
adapter = ArrayAdapter<String>(
this@MainActivity, android.R.layout.simple_list_item_1, rowList
)
}
}
rowList.add("row : ${System.currentTimeMillis()}")
textView.text = "항목 개수 : ${rowList.size}개"
val adapter = listView.adapter as ArrayAdapter<String>
adapter.notifyDataSetChanged()
rowList.removeLast()
textView.text = "항목 개수 : ${rowList.size}개"
val adapter = listView.adapter as ArrayAdapter<String>
adapter.notifyDataSetChanged()
항목을 자유롭게 디자인한 경우 사용하는 Adapter Class
val dataList = ArrayList<HashMap<String, Any>>()
for(idx in 0 until imgData.size){
val map = HashMap<String, Any>()
map["img"] = imgData[idx]
map["data1"] = textData1[idx]
map["data2"] = textData2[idx]
dataList.add(map)
}
val keys = arrayOf("img", "data1", "data2")
val ids = intArrayOf(R.id.imageViewRow, R.id.textViewRow1, R.id.textViewRow2)
adapter = SimpleAdapter(
this@MainActivity, dataList, R.layout.row, keys, ids
)
AdapterView 자체를 커스터마이징하여 특별한 기능을 사용하는 경우
BaseAdapter
baseAdapter를 상속받아 AdapterView 커스터마이징
- getCount : 보여줄 항목의 개수 반환
- getItem : 현재 순서의 보여줄 View 반환
- getItemId : 현재 순서의 보여줄 View ID 반환
- getView : 보여줄 항목의 View를 생성하여 반환
→ 해당 함수에서 반환하는 View를 현재 순서의 Row로 사용
- view : 항목별 관리할 viewBinding 객체 필요
- tag : view 안에 정보를 저장할 수 있는 요소 (객체 저장 가능)
- 모든 항목의 viewBinding 객체는 pool로 이동
→ 새롭게 보이는 view에 보였다가 스크롤되어 보이지 않게된 항목의 viewBinding 객체를 추출하여 사용 → pool에서 관리override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { // layout binding 객체를 담을 변수 var rowBiding : RowBinding? = null // 항목 View를 담을 변수 var mainView = convertView // 재사용 가능한 뷰가 없는 경우 if(mainView == null){ // viewBinding 객체 생성 rowBiding = RowBinding.inflate(layoutInflater) mainView = rowBiding.root mainView!!.tag = rowBiding } // 재사용 가능한 View가 있는 경우 else { // view에 저장되어 있는 viewBinding 객체 추출하여 사용 rowBiding = mainView!!.tag as RowBinding } }
항목을 나열하고 선택할 수 있도록 제공하는 AdapterView
val position = spinner.selectedItemPosition
textView.text = "선택 항목 : ${dataList[position]}"
// spinner 항목 설정
val dataList = arrayOf(
"data1","data2","data3"
)
activityMainBinding.run{
spinner.run{
val a1 = ArrayAdapter<String>(
this@MainActivity,
R.layout.simple_spinner_item,
dataList
)
a1.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
}
}
onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
textView.text = "${dataList[position]} 항목 선택"
}
override fun onNothingSelected(parent: AdapterView<*>?) {
// TODO("Not yet implemented")
}
}
inner class RecyclerAdapterClass {}
inner class ViewHolderClass(rowBinding: RowBinding) : RecyclerView.ViewHolder(rowBinding.root) {}
inner class RecyclerAdapterClass : RecyclerView.Adapter<RecyclerAdapterClass.ViewHolderClass>(){}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderClass {
val rowBinding = RowBinding.inflate(layoutInflater)
val viewHolderClass = ViewHolderClass(rowBinding)
return viewHolderClass
}
override fun getItemCount(): Int {}
override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {}
val params = RecyclerView.LayoutParams(
// 가로 길이
RecyclerView.LayoutParams.MATCH_PARENT,
// 세로 길이
RecyclerView.LayoutParams.WRAP_CONTENT
)
rowBinding.root.layoutParams = params
recyclerView.addItemDecoration(DividerItemDecoration(mainActivity, DividerItemDecoration.VERTICAL))
inner class RecyclerAdapterClass : RecyclerView.Adapter<RecyclerAdapterClass.ViewHolderClass>(){
inner class ViewHolderClass(rowBinding: RowBinding) : RecyclerView.ViewHolder(rowBinding.root), OnClickListener {
var textViewRow:TextView
var imageViewRow:ImageView
init{
textViewRow = rowBinding.textViewRow
imageViewRow = rowBinding.imageViewRow
}
override fun onClick(v: View?) {
activityMainBinding.textView.text = data[adapterPosition]
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderClass {
// ViewBinding
val rowBinding = RowBinding.inflate(layoutInflater)
// ViewHolder
val viewHolderClass = ViewHolderClass(rowBinding)
// 클릭 이벤트 설정
rowBinding.root.setOnClickListener(viewHolderClass)
return viewHolderClass
}
override fun getItemCount(): Int {
return imgList.size
}
override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {
holder.textViewRow.text = data[position]
holder.imageViewRow.setImageResource(imgList[position])
}
}
activityMainBinding.run{
recyclerView.run{
adapter = RecyclerAdapterClass()
layoutManager = LinearLayoutManager(this@MainActivity)
}
}
var adapter = activityMainBinding.recyclerView.adapter as MainActivity.RecyclerAdapter
adapter.notifyDataSetChanged()
listView
adapter : 항목 view 생성
- 거쳐가야하는 단계가 많다.
- view 재사용
recyclerView
pool : 화면에 보여주기 위한 역할
adapter : 항목 view 생성 + holder 관리
holder : 항목 1개를 구성하는 view ID 값
-> 해당 항목의 holder에 접근하여 사용
- viewHolder 재사용
- view에 재사용에 관련한 코드 구현 완료
- holder 사용에 관련된 코드 구현 필요