App/Android

[Kotlin] ListView 구현

sanadoing_ 2023. 11. 15. 20:14
728x90

 

 

 

 

 

 

전반적인 리스트뷰 동작 화면 📺

 

 

(연결 1) MainActivity에서 Adapter로 데이터를 보냅니다.

(연결 2) Adapter에서 item에 각각 데이터를 넣어 activity_main에 있는 Listview에 보냅니다.

 

참고로 이 예제에서는 string 데이터 2개로 구성된 datamodel를 사용할 겁니다. 

 

 

 

 

 

 

 

 


 

1

   Adapter 만들기 🎄 

 

 

 

 

 

 

 

 

ListViewAdapter.kt

package com.sanadoing.listview_ex

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView

// 리스트 데이터를 받습니다.
class ListViewAdapter(val List: MutableList<ListViewModel>) : BaseAdapter() {
    override fun getCount(): Int {
        return List.size
    }

    override fun getItem(p0: Int): Any {
        return List[p0]
    }

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

    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        
        // item을 만든 후 작성 
        
    }
}

 

 

 

 

 

 

 

 


 

2

   item(listview_item.xml) 만들기  🎄 

 

 

 

 

 

 

 

 

listview_item.xml

<?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="80dp">
    
    <TextView
        android:id="@+id/listviewItem"
        android:textSize="30sp"
        android:layout_margin="5dp"
        android:text="리스트뷰 아이템"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

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

</LinearLayout>

 

 

 

 

 

 

 

 

 


 

3

   listview(activity_main.xml) 만들기 🎄 

 

 

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".MainActivity">
    
    <ListView
        android:id="@+id/mainListview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

 

 

 

 


 

4

   데이터 모델 만들기 🎄 

 

 

 

 

 

ListViewModel.kt

 

package com.sanadoing.listview_ex

data class ListViewModel  (
    val title : String ="",
    val content : String = ""
        )

 

 

 

 

 

 

 

 


 

5

   연결하기 (그림 연결 1, 연결 2) 🎄 

 

 

 

1. MainAcitvity에서 Adapter로 데이터 전달

2. Adapter에서 데이터를 item에 넣어서 activity_main에 있는 listview에 연결

 

 

 

 

(연결 1, 연결 2) MainActivity.kt

package com.sanadoing.listview_ex

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.ListView

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

        val list_item = mutableListOf<ListViewModel>()

        list_item.add(ListViewModel("a", "b"))
        list_item.add(ListViewModel("c", "d"))
        list_item.add(ListViewModel("e", "f"))

        val listview = findViewById<ListView>(R.id.mainListview)

        // adapter 연결
        val listAdapter = ListViewAdapter(list_item)
        
        // listview에 adapter 연결 
        listview.adapter = listAdapter
    }
}

 

 

 

 

 

 

 


 

6

   listviewModel 형태의 데이터를 아이템이 넣기  🎄 

 

 

 

 

 

ListViewAdapter.kt

package com.sanadoing.listview_ex

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView

// 리스트 데이터를 받습니다.
class ListViewAdapter(val List: MutableList<ListViewModel>) : BaseAdapter() {
    override fun getCount(): Int {
        return List.size
    }

    override fun getItem(p0: Int): Any {
        return List[p0]
    }

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

    override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
        var convertView = p1

        if (convertView == null) {
            convertView =
                LayoutInflater.from(p2?.context).inflate(R.layout.listview_item, p2, false)
        }

        // 데이터를 아이템에 넣어줌 
        val title = convertView!!.findViewById<TextView>(R.id.listviewItem)
        val content = convertView!!.findViewById<TextView>(R.id.listviewItem2)
        title.text = List[p0].title
        content.text = List[p0].content
        // List[0] - > ListViewModel("a","b")
        // List[1] - > ListViewModel("d","d")
        // List[2] - > ListViewModel("e","f")

        return convertView!!
    }
}

 

 

 

 

 

 

 

 

복습 및 참고

인프런 - 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin) 개복치개발자

 

728x90