방명록
- [Android] DataBinding 적용하기 - 032023년 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
아래 글을 참고하여 작성 되었습니다.
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 다음글이 없습니다.이전글이 없습니다.댓글