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

+ Recent posts