-
[Android/Kotlin] 리스트뷰(ListView)Android/Kotlin 2022. 7. 6. 14:33반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<AddView 만드는 과정>
- 1. 아이템 리스트 준비
- 2. inflater 준비
- 3. inflater로 하나의 아이템에 해당하는 뷰 만들어 줌
- 4. 위에서 만든 뷰를 container 뷰에 붙여줌
<ListVeiw 만드는 과정>
- 1. 아이템 리스트 준비
- 2. Adapter 사용
<AddView와 ListView의 차이점>
- 1. 만드는 방식의 차이- 2. 뷰 그리는 방법 다름
- AddView : 리스트 갯수와 상관없이 한번에 다 그림
- 리스트 길이가 길어질수록 시간 오래 걸림
- ListView : 보여지는 부분(+보여지지 않지만 스크롤 한 경우 렉 없이 바로 보여줄 수 있을 만큼의 여유 부분)만 그리고 필요한 경우 더 그림
<리스트뷰 생성하기>
val adapter = ListViewAdapter(carList, LayoutInflater.from(this@ListView)) val listView: ListView = findViewById<ListView>(R.id.listView) listView.adapter = adapter
<어댑터 생성하기>
class ListViewAdapter(val carForList: ArrayList<Car>, val layoutInflater: LayoutInflater): BaseAdapter(){ override fun getCount(): Int { return carForList.size }//화면에 그릴 전체 개수 override fun getItem(position: Int): Any { return carForList.get(position) }//해당 인덱스에 해당하는 아이템 정보 override fun getItemId(position: Int): Long { return position.toLong() }//해당 position에 위치해 있는 아이템 뷰의 아이디 설정 override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = layoutInflater.inflate(R.layout.addview,null);//하나를 담당할 View //layoutInflater는 item을 어댑터에서 사용할 View로 inflate 해주는 역할 담당 val carNameTextView = view.findViewById<TextView>(R.id.car_name) val carEngineTextView = view.findViewById<TextView>(R.id.car_engine) carNameTextView.setText(carForList.get(position).name) carEngineTextView.setText(carForList.get(position).engine) return view } }
- getCount() : 화면에 그려질 View 개수 반환
- getItem() : 해당 position의 아이템 반환
- getItemId() : 각 아이템의 id 반환(특별히 아이디 사용할 일 없으면 0 반환해도 무방)
- getView() : xml 파일의 View와 데이터 연결(핵심 메서드)
<위 코드의 문제점>
- findViewById 메모리는 리소스를 많이 사용함(그려야 할 개수가 많아질수록 리소스 사용 증가)
- ViewHolder 사용하여 개선할 수 있음
- 최신 디바이스의 경우 성능에 큰 차이 없지만 개선해 주는 것이 좋음
class ListViewAdapter(val carForList: ArrayList<Car>, val layoutInflater: LayoutInflater): BaseAdapter(){ override fun getCount(): Int { return carForList.size }//화면에 그릴 전체 개수 override fun getItem(position: Int): Any { return carForList.get(position) }//해당 인덱스에 해당하는 아이템 정보 override fun getItemId(position: Int): Long { return position.toLong() }//해당 position에 위치해 있는 아이템 뷰의 아이디 설정 override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view: View val holder: ViewHolder if(convertView==null){ view = layoutInflater.inflate(R.layout.addview, null) holder = ViewHolder() holder.carName = view.findViewById(R.id.car_name) holder.carEngine = view.findViewById(R.id.car_engine) view.tag = holder } else{ holder = convertView.tag as ViewHolder view = convertView } holder.carName?.setText(carForList.get(position).name) holder.carEngine?.setText(carForList.get(position).engine) return view } } class ViewHolder{ var carName: TextView? = null var carEngine: TextView? = null }
- convertView : 실제 화면에 그려지는 아이템을 관리하는 배열
- 화면에 보여지는 만큼만 converView 생성하고 스크롤 하는 경우 View 재활용(성능 향상)
- converView null 체크 이유 : 리스트뷰 처음 실행하는 경우에는 무조건 화면 그려야 하므로
<아이템 클릭 리스너>
- setOnItemClickListener 사용
listView.setOnItemClickListener { parent, view, position, id -> Toast.makeText(this@ListView, "토스트 메시지"+position, Toast.LENGTH_LONG).show() }
<아이템뷰 구분선 삭제>
- 기본으로 그려지는 아이템 구분선 삭제
- divider="null" 사용
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="null"/>
반응형'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] TabLayout, pager (0) 2022.07.08 [Android/Kotlin] 리사이클러뷰(RecyclerView) (0) 2022.07.07 [Android/Kotlin] AddView (0) 2022.07.05 [Android/Kotlin] 스레드(Thread) (0) 2022.07.03 [Android/Kotlin] Context (0) 2022.07.03