ListView는 AddView에 비해 자원을 훨씬 효율적으로 사용할 수 있다.
AddView와 ListVew 차이점
- View를 생성하고 구현하는 과정이 다르다.
- 그리는 방식이 addView는 모든 뷰를 바로 생성하지만, ListView는 보이는 부분 + 일부분 정도만 만들고, 필요한 경우에 따라 추가로 view를 생성한다.
ListView 구현과정
- 리스트로 보여줄 대상이 되는 리스트를 준비한다. (화면에 출력할 객체List와, view를 담을 <ListView> Component )
- 리스트 뷰를 만들어 줄 Adapter를 구현하고, <ListView>에 adapter를 적용해 view를 그린다.
대상이 될 객체 List를 준비한다.
val carList = ArrayList<CarForList>()
xml에 <ListView> Component를 생성하고 id를 부여한다.
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView>
Adapter를 구현한다.
class ListViewAdapter(val carList: ArrayList<CarForList>, val layoutInflater: LayoutInflater ): BaseAdapter() { override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = layoutInflater.inflate(R.layout.item_view, null) var carNameTextView = view.findViewById<TextView>(R.id.car_name) var carEngineTextView = view.findViewById<TextView>(R.id.car_engine) carNameTextView.setText(carList.get(position).name) carEngineTextView.setText(carList.get(position).engine) return view } override fun getItem(position: Int): Any { return carList.get(position) } override fun getItemId(position: Int): Long { return position.toLong() } override fun getCount(): Int { return carList.size } }
객체 List를 넣어서 adapter 인스턴스를 생성하고, <ListView>에 적용한다.
val adapter = ListViewAdapter(carList, LayoutInflater.from(this@ListViewActivity)) val listView = findViewById<ListView>(R.id.listView) listView.adapter = adapter
List에 click 이벤트로 Toast 출력하기.
val listView = findViewById<ListView>(R.id.listView) listView.adapter = adapter listView.setOnItemClickListener{ parent, view, position, id -> val car = adapter.getItem(position) as CarForList Toast.makeText(this@ListViewActivity, car.name + " " + car.engine, Toast.LENGTH_LONG).show() }
List에 기본 divider(border) 제거하기
divider 뿐 아니라 여러 속성이 있다 필요시 찾아서 사용하면 된다.
//<ListView>에 divider="@null" 속성 추가 android:divider="@null"
ListView 사용시 성능 향상을 위한 Holder 사용
ListView 생성시 view를 계속 생성하기 보단, Holder를 사용하면 생성한 View에 값을 변경해 View를 재사용하는 것으로 디바이스 자원을 절약할 수 있다.
한 화면에 표시할 수 있는 최대 View의 갯수만큼은 새롭게 생성 되지만, 화면이 스크롤해서 넘어가면 화면에서 벗어난 View를 다시 가져와 값만 새롭게 넣어서 화면에 출력하는 방식으로 동작된다.
Holder 구현
class ViewHolder { var carName: TextView? = null var carEngine: TextView? = null }
Holder를 사용한 View 생성
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view : View val holder: ViewHolder if(convertView == null) { view = layoutInflater.inflate(R.layout.item_view, 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(carList.get(position).name) holder.carEngine?.setText(carList.get(position).engine) return view }
'Android > Android기본' 카테고리의 다른 글
Permission (0) | 2021.11.24 |
---|---|
AddView (0) | 2021.11.24 |
RecyclerView (0) | 2021.11.24 |
TabLayout, Pager (0) | 2021.11.24 |
SharedPreference (0) | 2021.11.24 |
Uploaded by Notion2Tistory v1.1.0