엔지니어 규 2022. 7. 10. 13:46
728x90

이전 포스팅에서 addview 로 리스트뷰를 만드는 방법을 알아봤다.

 

 

복습차원에서 addview에 필요한 요소들을 정리해보자.

 

-addView-

1. 리스트로 만들고 싶은 아이템의 리스트를준비한다.

2. 인플레이터를 준비한다.

3. 인프레이터로 아이템 하나에 해당하는 뷰를 만들어준다.

4. 위에만든 뷰를 컨테이너뷰에 붙여준다.

 

ListView에 필요한 요소는  다음과 같다.

 

-ListView-

1. 리스트로 만들고 싶은 아이템의 리스트를 준비한다.

2. Adapter를 이용한다.

 

addview와 Listview 의 차이점 을 알아보자면

 

1. 만드는 방식이 다르다.

 

2. 그리는 방식이 다르다.

- Addview -> 리스트의 갯수와 상관없이 한번에 다 그린다.

- Listview -> 보여지는 화면 + alpha  만 한번에 그리고, 필요한 경우에 더 그린다.

 

 

예를들면 10000명의 전화번호부를 만들때,

Addview 는 10000명의 리스트갯수를 다 그린다고 치면 ,

ListView 는 화면에 보여지는 전화번호(예: 10개) 에 + alpha 를 adapter를 이용해 그려 놓음으로써

스크롤을 하게 되면 해당 view가 보이게 만든다.

다시 위와 같은 android 를 ListView 를 이용하여 그려보자.

 

package com.example.listview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ListView
import android.widget.TextView
import android.widget.Toast
import java.util.ArrayList

class ListViewActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.listview)
        
        val carList = ArrayList<CarForList>()
        for (i in 0 until 20) {
            carList.add(CarForList("" + i + "번째 자동차", "" + i + "번째 엔진"))
        }
        val adapter = ListViewAdapter(carList, LayoutInflater.from(this@ListViewActivity))
        val listview = findViewById<ListView>(R.id.listView)
        listview.adapter = adapter
        listview.setOnItemClickListener { parent, view, position, id ->
            val carName = (adapter.getItem(position) as CarForList).name
            val carEngine = (adapter.getItem(position) as CarForList).engine

            Toast.makeText(this@ListViewActivity, " " + carEngine + "" + carName, Toast.LENGTH_LONG)
                .show()
        }
    }

    class ListViewAdapter(
        val carForList: ArrayList<CarForList>,
        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()
        }

        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(carForList.get(position).name)
            holder.carEngine?.setText(carForList.get(position).engine)

            return view
        }
    }

        class ViewHolder {
            var carName: TextView? = null
            var carEngine: TextView? = null

        }
        class CarForList(val name: String, val engine: String) {}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0FC9CF"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">
        
        <TextView
            android:id="@+id/car_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:padding="6dp"
            android:textSize="20dp">
        </TextView>

        <TextView
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="#B53E6BDC">
        </TextView>

        <TextView
            android:id="@+id/car_engine"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:textSize="20dp">

        </TextView>

    </LinearLayout>

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="1dp">
    </androidx.appcompat.widget.LinearLayoutCompat>

</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ListViewActivity">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listView"
        android:divider="@null">
    </ListView>

</LinearLayout>
728x90