item.xml에 layout 추가 후 data(model) 설정
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data
<variable
name="calDay"
type="com.ilsamil.readingdiary.model.CalendarDay" />
</data>
...
</layout>
item.xml에 data 지정
- android:text="@{calDay.day}",
- app:readCheck="@{calDay}"
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="55dp"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/item_dayText_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15sp"
android:text="@{calDay.day}"
android:layout_marginTop="5dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="13"
/>
<ImageButton
android:id="@+id/item_read_ibtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:layout_marginBottom="5dp"
android:background="@color/white"
android:src="@drawable/ic_baseline_brightness_1_24"
android:visibility="invisible"
app:readCheck="@{calDay}"
app:layout_constraintStart_toStartOf="@+id/item_dayText_tv"
app:layout_constraintEnd_toEndOf="@+id/item_dayText_tv"
app:layout_constraintTop_toBottomOf="@id/item_dayText_tv"
app:layout_constraintBottom_toBottomOf="parent"
tools:visibility="visible"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Adapter Holder에 binding 추가
class CalendarViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val binding = ItemCalendarBinding.bind(itemView)
}
Adapter onBindViewHolder에 데이터 매칭
override fun onBindViewHolder(holder: CalendarViewHolder, position: Int) {
holder.binding.calDay = dayList[position]
}
BindingAdapter 추가
object DataBindingAdapter {
@BindingAdapter("readCheck")
@JvmStatic
fun setReadCheck(imageButton: ImageButton, calDay : CalendarDay) {
if (!calDay.isEmpty) {
imageButton.visibility = View.VISIBLE
if (calDay.isRead) {
imageButton.setImageResource(R.drawable.ic_baseline_brightness_check_1_24)
}
}
}
}
전체 코드
item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="calDay"
type="com.ilsamil.readingdiary.model.CalendarDay" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="55dp"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<TextView
android:id="@+id/item_dayText_tv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="15sp"
android:text="@{calDay.day}"
android:layout_marginTop="5dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
tools:text="13"
/>
<ImageButton
android:id="@+id/item_read_ibtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="3dp"
android:layout_marginBottom="5dp"
android:background="@color/white"
android:src="@drawable/ic_baseline_brightness_1_24"
android:visibility="invisible"
app:readCheck="@{calDay}"
app:layout_constraintStart_toStartOf="@+id/item_dayText_tv"
app:layout_constraintEnd_toEndOf="@+id/item_dayText_tv"
app:layout_constraintTop_toBottomOf="@id/item_dayText_tv"
app:layout_constraintBottom_toBottomOf="parent"
tools:visibility="visible"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Adapter
class CalendarViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val binding = ItemCalendarBinding.bind(itemView)
}
class CalendarAdapter(calendarList : ArrayList<CalendarDay>) : RecyclerView.Adapter<CalendarViewHolder>() {
private var dayList : ArrayList<CalendarDay> = calendarList
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CalendarViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_calendar, parent, false)
return CalendarViewHolder(view)
}
override fun onBindViewHolder(holder: CalendarViewHolder, position: Int) {
holder.binding.calDay = dayList[position]
}
override fun getItemCount(): Int {
return dayList.size
}
object DataBindingAdapter {
@BindingAdapter("readCheck")
@JvmStatic
fun setReadCheck(imageButton: ImageButton, calDay : CalendarDay) {
if (!calDay.isEmpty) {
imageButton.visibility = View.VISIBLE
if (calDay.isRead) {
imageButton.setImageResource(R.drawable.ic_baseline_brightness_check_1_24)
}
}
}
}
}
'기술적용' 카테고리의 다른 글
RecyclerView - item 위치 찾기 (0) | 2022.08.06 |
---|---|
Glide 구현 (0) | 2022.06.03 |
Jetpack Navigation, Bottom navigation 연동 (0) | 2022.05.14 |
Jetpack Navigation 이동 (Fragment -> Fragment) (0) | 2022.05.09 |
Navigation safe args 구현 (0) | 2022.05.07 |