본문 바로가기
Android

[Kotlin] Android ROOM + LiveData + ListView

by bryan.oh 2023. 8. 31.
반응형

Android
ROOM
LiveData
ListView

 

ROOM 을 사용해서 LiveData 를 조회하고

ListView 에 Adapter 로 바인딩 해서,

데이터가 수정되면 ListView 에 바로 적용되는 것을 확인해보겠습니다.

 

실제로 앱을 만들면서 하시려면 이전 글부터 하시면 됩니다.
2023.08.24 - [Android] - [Kotlin] 코틀린 Room Database 사용하기. CRUD
Retrofit2 로 데이터 조회해서 Room db에 데이터 넣으려면 아래 글을..
2023.08.24 - [Android] - [Kotlin] 코틀린 안드로이드 ROOM (database) 사용해보기

 

Activty 생성

적당한 이름의 Activity 를 생성합니다.

그리고 Binding 사용하도록 코드 수정.

binding 사용은 아래 글 참고
[Kotlin] findViewById 대신에 View binding
class ListViewTestActivity : AppCompatActivity() {
    lateinit var binding: ActivityListViewTestBinding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityListViewTestBinding.inflate(layoutInflater)
        setContentView(binding.root)
    }
}

 

Item Class 는 이전에 사용하던 PublicHolidays 를 쓰겠습니다.

PublicHolidays.kt
package com.example.test01.models

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.google.gson.annotations.SerializedName
import java.util.Date

@Entity(tableName = "holidays")
data class PublicHolidays(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "date")
    @SerializedName("date")
    val date: Date,
    @ColumnInfo(name = "local_name")
    @SerializedName("localName")
    var dateName: String,
    @SerializedName("name") val engName: String,
    @SerializedName("countryCode") val locale: String,
    @SerializedName("fixed") val fixed: Boolean,
    @SerializedName("global") val global: Boolean,
    @SerializedName("counties") val counties: String?,
    @SerializedName("launchYear") val launchYear: String?,
    @SerializedName("type") val type: String
)

 

ListView 의 Item Layout 생성

res/layout 에 custom_holiday_listview_item.xml 로 파일을 만들고 아래와 같이 layout 을 구성합니다.

우선 ImageView 는 src 를 고정하겠습니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/square_phone_icon"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/holiday_name"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:textSize="20sp"
            android:text="TextView" />

        <TextView
            android:id="@+id/holiday_date"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:textSize="20sp"
            android:text="TextView" />

    </LinearLayout>

</LinearLayout>

 

 

ListView Adapter 

그리고 listView 의 Adapter 를 생성합니다.

HolidayListViewAdapter.kt
package com.example.test01.adapters

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import com.example.test01.databinding.CustomHolidayListviewItemBinding
import com.example.test01.models.PublicHolidays

class HolidayListViewAdapter(private val items: List<PublicHolidays>): BaseAdapter() {
    override fun getCount(): Int = items.size

    override fun getItem(position: Int): PublicHolidays = items[position]

    override fun getItemId(position: Int): Long {
        return items[position].id.toLong()
    }

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
        val binding = CustomHolidayListviewItemBinding.inflate(LayoutInflater.from(parent?.context))
        val item: PublicHolidays = items[position]

        with(binding){
            holidayName.text = item.dateName
            holidayDate.text = item.date.toString()
        }

        return binding.root
    }
}
여기서 CustomHolidayListviewItemBinding 는 layout file 이름을 camel case 로 바꾸고 뒤에 Binding 붙히면 됩니다.

PublicHoliday data class 의 dateName  과 date 만 보여줍니다.

 

사용

그리고 ListView 를 사용할 Activiy 에서.

lateinit var database: HolidayDatabase

room 을 사용해서 데이터를 가져오기 위해 HolidayDatabase 를 class property 로 생성합니다.

참고 : HolidayDatabase 생성했던 글

 

그리고 onCreate() 에서 

database = HolidayDatabase.getInstance(this)

데이터 조회는,

var holidays = database.publicHolidayDao().getAllHolidays()
holidays.observe(this){
	// 데이터 조회/변경 시 실행
}

LiveData 라서, observe 를 사용해야합니다.

 

HolidayListViewAdapter 를 사용해서 ListView 에 데이터를 전달해줍니다.

var holidayAdapter: HolidayListViewAdapter? = null
var holidays = database.publicHolidayDao().getAllHolidays()
holidays.observe(this){
    holidayAdapter = HolidayListViewAdapter(it)
    binding.listviewtestListview.adapter = holidayAdapter
    holidayAdapter?.notifyDataSetChanged()
}

 

 

참고

OnItemClickListener

 

 

 

 

 

 

728x90
반응형

댓글