일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- gradle
- socket-client
- NoSuchMethodError
- 워치
- Galaxy Watch
- mosquitto
- hung-up
- OZViewer
- Kotlin
- Flavors
- git-push
- cloud-firestore
- Java8
- firebase-storage
- JNI
- BottomSheetDialog
- Android
- google-login
- 오즈뷰어
- socket.io
- socket-server
- Firebase
- AWS
- firebase-database
- git
- ActivityResult-API
- mqtt
- Dva
- ozd
- TIZEN
- Today
- Total
Hyeyeon blog
[Android] DataBinding으로 RecyclerView 만들기 (리스트 높이 제한 방법) 본문
1. DataBinding 설정
build.gradle(Module)에 DataBinding 설정을 추가합니다.
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
...
// 설정 추가
buildFeatures {
dataBinding = true
}
}
2. RecyclerView의 아이템 layout 생성
1) 리스트의 아이템으로 사용될 layout의 xml을 생성합니다.
- 전체 레이아웃을 <layout> 태그로 감싸게 되면 레이아웃 이름의 카멜형태로 데이터바인딩 객체가 생성됩니다.
- list_item.xml으로 만들면 ListItemBinding 객체가 생성됩니다.
2) 이미지와 텍스트로 구성된 아이템으로 상단에 표시할 텍스트를 변수명으로 선언합니다.
3) 변수명을 TextView에 android:text=@{변수명} 형태로 넣어줍니다.
<?xml version="1.0" encoding="utf-8"?>
<layout>
// 표시될 텍스트 명시
<data>
<variable
name="name"
type="String" />
</data>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@android:drawable/star_on"
android:layout_gravity="center_vertical"/>
<TextView
android:id="@+id/textview_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="12dp"
android:textSize="14sp"
/* 상단에 선언한 String 변수명 입력 */
android:text="@{name}"
/>
</LinearLayout>
</layout>
3. 리스트가 표시될 화면의 layout xml에 RecyclerView 추가
1) layout xml에 RecyclerView를 추가합니다.
2) RecyclerView 태그의 orientation으로 리스트가 표시/스크롤될 방향을 명시합니다. (vertical: 세로, horizontal: 가로)
3) 리스트가 그려질 모양에 맞게 layoutManager를 명시합니다.
- 목록 형태: LinearLayoutManager
- 그리드 형태 (바둑판 형태): GridLayoutManager
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/* 리스트가 그려질 방향 */
android:orientation="vertical"
/* 리스트가 그려질 모양 */
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
/>
</LinearLayout>
</layout>
4. RecyclerView의 Adapter와 ViewHolder 생성
1) RecyclerView.Adapter를 상속받는 Adapter 클래스를 생성합니다.
2) 생성한 Adapter 클래스의 안에 inner class로 RecyclerView.ViewHolder를 상속받는 ViewHolder 클래스를 생성합니다.
3) Adapter 클래스의 onCreateViewHolder()에서 2번에서 생성한 item layout을 binding한 후 ViewHolder 클래스를 반환합니다.
4) ViewHolder 클래스에 데이터를 바인딩하기위한 bind()를 생성한 후 item layout에 명시한 변수명으로 데이터를 바인딩합니다.
class CustomAdapter(private val list : List<String>) : RecyclerView.Adapter<CustomAdapter.CustomViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
// item layout 바인딩 객체 생성
// item layout의 xml 파일 명을 list_item.xml으로 만들었기 때문에, ListItemBinding 객체가 생성됨
val binding = DataBindingUtil.inflate<ListItemBinding>(
LayoutInflater.from(parent.context),
R.layout.list_item, parent, false
)
return CustomViewHolder(binding)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(list[position])
}
override fun getItemCount(): Int {
return list.size
}
inner class CustomViewHolder(private val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(text: String) {
// item layout에 명시한 변수인 "name"에 값을 넣음
binding.name = text
}
}
}
5. Recyclerview와 Adapter 연결
Adapter를 생성하여 RecyclerView에 연결합니다.
val binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
val items = listOf("Sophia", "Emma", "Olivia", "Abigail")
val adapter = ListAdapter(items)
binding.recyclerview.adapter = adapter
⭐️ 6. RecyclerView의 길이를 제한하고 싶을 경우 ⭐️
1) RecyclerView가 ConstraintLayout 아래에 있어야 합니다.
2) RecyclerView 태그에 아래와 같이 값을 설정합니다.
- app:layout_constrainedHeight="true"
- app:layout_constraintHeight_max="200dp" // 리스트의 높이 값
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f1f1f1"
android:orientation="vertical">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintVertical_bias="0"
// 추가할 설정
app:layout_constrainedHeight="true"
app:layout_constraintHeight_max="200dp"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
'개발 > Android' 카테고리의 다른 글
[Android] JNI 오류 - error=2, No such file or directory (0) | 2023.02.25 |
---|---|
[Android] Github Actions으로 Android CI 구현하기 (0) | 2023.01.04 |
[Android] NFC on, off 상태 확인 (기본모드, 카드모드, 비활성화) (0) | 2022.06.23 |
[Android] 갤러리에서 사진 가져오기 - ActivityResultLauncher, Intent (0) | 2022.03.02 |
[Android] Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8 해결 방법 (0) | 2021.12.07 |