ListView는 AddView에 비해 자원을 훨씬 효율적으로 사용할 수 있다.

AddView와 ListVew 차이점

  1. View를 생성하고 구현하는 과정이 다르다.
  1. 그리는 방식이 addView는 모든 뷰를 바로 생성하지만, ListView는 보이는 부분 + 일부분 정도만 만들고, 필요한 경우에 따라 추가로 view를 생성한다.

 

 

ListView 구현과정

  1. 리스트로 보여줄 대상이 되는 리스트를 준비한다. (화면에 출력할 객체List와, view를 담을 <ListView> Component )
  1. 리스트 뷰를 만들어 줄 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

+ Recent posts