스팀 앱 개발기 #69 - 태그 화면에 데이터 바인딩 적용
시작하며...
지난 포스트에서는 태그 화면을 구성하는 레이아웃을 작성했구요. 오늘은 그것과 데이터를 연결하기 위한 데이터 바인딩을 구현해 보겠습니다.
작업 개요
- UI 모듈의 build.gradle 수정
- PostItemListAdapter 클래스 정의
- DataBindingUtil 오브젝트 클래스 정의
- fragment_tags 레이아웃의 RecyclerView 뷰에 바인딩 적용
UI 모듈의 build.gradle 수정
레이아웃의 RecyclerView 뷰와 포스트 리스트를 바인딩 해야 하는데요. 여기서 BindingAdapter가 필요하구요. 이를 위해서는 build.gradle 파일에 kotlin-kapt 플러그인을 추가해야 합니다.
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}
//...
PostItemListAdapter 클래스 정의
RecyclerView 뷰에 포스트 리스트를 보여주기 위해서는 뷰와 리스트를 이어주는 어댑터 클래스가 필요합니다.
class PostItemListAdapter : RecyclerView.Adapter<PostItemListAdapter.PostItemListViewHolder>() {
val postItemList = mutableListOf<PostItem>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PostItemListViewHolder {
return PostItemListViewHolder(LayoutPostItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
))
}
override fun onBindViewHolder(holder: PostItemListViewHolder, position: Int) {
try {
holder.bind(postItemList[position])
}
catch (e: IndexOutOfBoundsException) {
e.printStackTrace()
}
}
override fun getItemCount(): Int = postItemList.size
fun setList(list: List<PostItem>) {
this.postItemList.apply {
clear()
addAll(list)
}
notifyDataSetChanged()
}
inner class PostItemListViewHolder(
private val binding: LayoutPostItemBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(postItem: PostItem) {
binding.postItem = postItem
}
}
}
DataBindingUtil 오브젝트 클래스 정의
@BindingAdapter("속성이름") 애노테이션을 이용하면, 레이아웃의 뷰에 'app:속성이름'으로 속성을 추가할 수 있습니다. 아래 코드의 bind 함수가 그렇고요. 1번째 파라메터는 적용할 뷰를, 2번째 파라메터에는 해당 속성의 값을 의미합니다. 아래 코드에서는 recyclerView 뷰에 postItemList 리스트를 적용한다는 의미이죠. 그러면 PostItemListAdapter 클래스 안에 정의된 바인딩에 의해 자동으로 RecyclerView 뷰가 업데이트 됩니다.
object DataBindingUtil {
@BindingAdapter("postItemList")
fun bind(recyclerView: RecyclerView?, postItemList: List<PostItem>?) {
(recyclerView?.adapter as PostItemListAdapter)?.let {
if (null != postItemList) {
it.setList(postItemList)
}
}
}
}
fragment_tags 레이아웃의 RecyclerView 뷰에 바인딩 적용
위 bind 함수를 정의하였으므로 androidx.recyclerview.widget.RecyclerView 뷰에 app:postItemList 속성을 아래와 같이 정의할 수 있습니다.
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_post_item"
android:layout_width="match_parent"
android:layout_height="0dp"
app:postItemList="@{viewModel.rankedPosts}"
app:layout_constraintTop_toBottomOf="@id/radiogroup_sort"
app:layout_constraintBottom_toBottomOf="parent"
tools:listitem="@layout/layout_post_item" />
GitHub Commit
https://github.com/netrance/dorian-steem-apps/commit/35eabb6f882b378396a6a5984f86643c748099d4
지난 스팀 앱 개발기
- #66 - bridge.get_ranked_posts API 연동 구현: ReadRankedPostsUseCase 클래스 추가
- #65 - bridge.get_ranked_posts API 연동 구현: SteemRepository 인터페이스, SteemRepositoryImpl 클래스 수정
- #64 - bridge.get_ranked_posts API 연동 구현: SteemService 인터페이스에 메소드 추가
- #63 - bridge.get_ranked_posts API 관련 데이터 클래스 추가 수정
- #62 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 수정
- #61 - layout_post_item.xml 수정 후 예상치 못한 빌드 오류
- #60 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 정의
- #59 - 태그별 포스트 리스트를 구하기 위한 bridge.get_ranked_posts API
- #58 - 포스트 리스트를 구성할 항목의 레이아웃 (3) 데이터 클래스 정의 및 데이터 바인딩 적용
- #57 - 포스트 리스트를 구성할 항목의 레이아웃 (2)
- #56 - 포스트 리스트를 구성할 항목의 레이아웃
- #55 - .gitignore 파일 작성
- #54 - RxJava 관련 메모리 누수 방지 코드 작성
- #53 - 버그 수정: 인터넷 미연결시 API 실행하면 앱 강제 종료
- #52 - 인터넷 미연결시 API 실행하면 어떻게 될까?
- #51 - 파워다운 끝났으나 SP to power down 값이 0이 아닌 버그
- #1 ~ #50
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Upvoted! Thank you for supporting witness @jswit.