핀수로그
  • [Android] DataBinding 적용하기 - 03
    2023년 09월 27일 22시 18분 50초에 업로드 된 글입니다.
    작성자: 핀수
    728x90
    반응형
     

    지난 글에서는 개인 프로젝트인 WW에 DataBinding을 적용하며 알게 된 것들을 기술해보았다.
    이번 글에서는 RecyclerView에 DataBinding을 적용하는 방법에 대해 알아볼 것이다.
     

    RecyclerView에 DataBinding 적용하기

    데이터바인딩도 좋고 다 좋지만
    아이템 갯수가 0개이면 onCreateViewHolder 호출 안되는거 명심하고....(to me from me...)
    데이터가 변경 됐으면 됐다고 알려주는 거 잊지 말자고...^^
     
    이번 글에서 적용해줄 레이아웃 친구를 소개한다(?)

    1. BindingAdapter 만들기

    @SuppressLint("NotifyDataSetChanged")
    @BindingAdapter("app:items")
    fun setForecastList(recyclerView: RecyclerView, items: List<ForecastDO?>?) {
        items?.let {
            val recyclerAdapter = recyclerView.adapter as ForecastAdapter
            recyclerAdapter.dataList = it.toMutableList()
            recyclerAdapter.notifyDataSetChanged()
        }
    }

    2. 리사이클러뷰 xml에 적용하기

    <androidx.recyclerview.widget.RecyclerView
              android:id="@+id/main_forecast_rv"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:layout_marginTop="8dp"
              android:orientation="vertical"
              android:overScrollMode="never"
              app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
              app:items="@{weatherViewModel.getForecastValue}"
              tools:listitem="@layout/item_forecast" />

    3. 리사이클러뷰 어댑터에 items 지정하기

    바인딩 어댑터에서 해당 리사이클러뷰 어댑터의 dataList에 해당 데이터를 넘겨주었다.

     override fun onBindViewHolder(holder: BaseViewHolder<VB>, position: Int) {
            handlingViewHolder(holder, dataList[holder.adapterPosition], position)
        }
    private fun handlingViewHolder(viewHolder: BaseViewHolder<VB>, data: T, position: Int){
        bind(viewHolder, data)
        viewHolder.itemView.setOnClickListener { itemClickListener(viewHolder, data, position) }
    }

    item = it
    부분이 실제로 리사이클러뷰 각 아이템에 데이터를 연결해주는 부분이다.
    executePendingBindings() 함수는
    변수나 observable 객체가 변경될 때 바인딩은 다음 프레임 이전에 변경되도록 예약된다고 한다.
    그러나 바인딩이 즉시 실행되어야 하는 경우에 이를 강제로 실행하기 위한 함수이다.

    @SuppressLint("SetTextI18n")
    override fun bind(viewHolder: BaseViewHolder<ItemForecastBinding>, data: ForecastDO?) {
        viewHolder.vb?.run {
            itemWearingTimeRv.layoutManager = LinearLayoutManager(mContext, RecyclerView.HORIZONTAL, false)
            itemWearingTimeRv.adapter = HourlyForecastAdapter()
    
            data?.let {
                item = it
                itemWearingInfoRoot.wearInfo = Utility.getWearingInfo(data.maxTemp.toDouble())
                executePendingBindings()
                itemWearingMaxBtn.setOnClickListener {
                    itemWearingInfoRoot.wearInfo = Utility.getWearingInfo(data.maxTemp.toDouble())
                }
                itemWearingMinBtn.setOnClickListener {
                    itemWearingInfoRoot.wearInfo = Utility.getWearingInfo(data.minTemp.toDouble())
                }
            }
    
        }
    }

    리사이클러뷰의 listItem인 item_forecast의 레이아웃을 보면 data의 이름이 item인 것을 알 수 있다.

    <layout
        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"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
    
        <data>
            <variable
                name="item"
                type="com.pinslog.ww.model.ForecastDO" />
        </data>
        ...
    </layout>

     
    이것으로 WW에 DataBinding을 적용하며 알게된 것을 얼추 작성해보았다!
    물론 아직 알아야할 것들이 많겠지만 ㅎㅎ
    적용하다가 모르는 것이 생기면 또 글을 남기도록 하자 ㅎㅎ


    공부하며 작성된 글이라 잘못된 정보가 있을 수 있습니다.
    말씀해주시면 수정하겠습니다. 감사합니다.

    References

    아래 글을 참고하여 작성 되었습니다.

     

    생성된 결합 클래스  |  Android 개발자  |  Android Developers

    생성된 결합 클래스 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 데이터 결합 라이브러리는 레이아웃의 변수 및 뷰에 액세스하는 데 사용되는 결합 클래

    developer.android.com

     

    728x90
    반응형

    'Android > Android' 카테고리의 다른 글

    [Android] Jetpack Compose? true!  (0) 2023.09.30
    [Android] Room 살펴보기  (0) 2023.09.28
    [Android] DataBinding 적용하기 - 02  (0) 2023.09.26
    [Android] DataBinding 적용하기 - 01  (0) 2023.09.25
    [Android] BLE 통신 구현하기  (2) 2023.05.29
    댓글