반응형
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
반응형
'Android' 카테고리의 다른 글
[Kotlin] 안드로이드 Custom Dialog (1) | 2023.09.01 |
---|---|
[Kotlin] Android ListView ItemClick Listener (0) | 2023.08.31 |
[Kotlin] 코틀린 Room Database 사용하기. CRUD (0) | 2023.08.24 |
[Kotlin] 코틀린 안드로이드 ROOM (database) 사용해보기 (0) | 2023.08.24 |
[Kotlin] Background Thread (ThreadExecutor 사용하기) (0) | 2023.08.18 |
댓글