ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.