Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[Android] ListView, Adapter, Model 본문

인프런/[인프런] 앱 8개를 만들면서 배우는 안드로이드 코틀린

[Android] ListView, Adapter, Model

Seung__ 2022. 3. 17. 23:05

ListView를 사용하는 경우 흐름은 다음과 같다.

한 Activity에서 dataLisst를 Adapter에 전달

Adapter는 받은 dataList에서 하나씩 꺼내서 각 item마다 view를 만들어 ListView에 전달.

최종적으로 ListView에는 dataLIst를 기반으로 만들어진 view가 list의 형대로 보여짐.

 

1. Adapter 생성


  - Adapter의 역할: 데이터를 받아와서 (list)view생성

  - 표시할 데이터 생성자 주입

  - BaseAdapter() 상속

  - 메서드들은 자동으로 호출됨. 개별로 호출할 필요 없음.

class ListViewAdapter(val list: MutableList<String>) : BaseAdapter(){

    override fun getCount(): Int {
        return list.size
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
    
        var convertView = convertView
        
        //listview_item을 사용함.
        if (convertView == null){
            convertView = LayoutInflater.from(parent?.context).inflate(R.layout.listview_item,parent, false)
        }

        //해당 view에 값 설정.
        val title = convertView!!.findViewById<TextView>(R.id.listviewItem)
        title.text = list[position]

        return convertView!!
    }

    override fun getItem(position: Int): Any {
        return list[position]
    }

    override fun getItemId(position: Int): Long {
       return position.toLong()
    }
}

 

2. ListVIew


<?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="80sp">

    <TextView
        android:id="@+id/listviewItem"
        android:text="리스트뷰 아이템"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5sp"/>

</LinearLayout>

 

3. MainActivity


Activity에서 adaper생성 후 view와 adapter를 연결해줌.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val listItem = mutableListOf<String>()
            listItem.add("A")
            listItem.add("B")
            listItem.add("C")

		//listView 설정
        val listView = findViewById<ListView>(R.id.listViewId)

		//adapter 설정 및 data 전달
        val adapter = ListViewAdapter(listItem)
        
        //view와 adapter 연결
        listView.adapter = adapter
        
    }
}

 

4. Model 전달


위와 같이 List 객체를 직접 전달할 수 도 있지만 data class를 사용할 수 도 있다.

data class ListViewModel (
    var title: String = "",
    var content: String = ""
)
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val listItem = mutableListOf<ListViewModel>()
            listItem.add(ListViewModel("A", "a"))
            listItem.add(ListViewModel("B", "b"))
            listItem.add(ListViewModel("C", "c"))

        val listView = findViewById<ListView>(R.id.listViewId)

        val adapter = ListViewAdapter(listItem)
        //view의 adapter설정
        listView.adapter = adapter

    }
}
class ListViewAdapter(val list: MutableList<ListViewModel>) : BaseAdapter(){

    override fun getCount(): Int {
        return list.size
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        var convertView = convertView
        if (convertView == null){
            convertView = LayoutInflater.from(parent?.context).inflate(R.layout.listview_item,parent, false)
        }

        //textView에 값 설정.
        val title = convertView!!.findViewById<TextView>(R.id.listviewItem)
        title.text = list[position].toString()

        return convertView!!
    }

    override fun getItem(position: Int): Any {
        return list[position]
    }

    override fun getItemId(position: Int): Long {
       return position.toLong()
    }
}
Comments