문제
RecyclerView Grid 형태로 2줄 만들 때 한쪽으로 치우침
- 좌,우, 상, 하 일정한 여백을 주어 아이템들을 중앙에 배치하고 싶다.
해결
1. layout_xml에 RecyclerView 추가
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0sp"
android:layout_height="0sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/app_bar"
app:layout_constraintBottom_toBottomOf="parent"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="2"
android:layout_marginStart="10sp"
android:layout_marginEnd="10sp"
android:layout_marginBottom="70sp" />
2. GridSpaceItemDecoration 클래스 만들기
GridSpaceItemDecoration.kt
class GridSpaceItemDecoration(val spanCount: Int, val space: Int): RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
val position = parent.getChildAdapterPosition(view)
val column = position % spanCount + 1 // 1부터 시작
/** 첫번째 행(row-1)에 있는 아이템인 경우 상단에 [space] 만큼의 여백을 추가한다 */
if (position < spanCount){
outRect.top = space
}
/** 마지막 열(column-N)에 있는 아이템인 경우 우측에 [space] 만큼의 여백을 추가한다 */
if (column == spanCount){
outRect.right = space
}
/** 모든 아이템의 좌측과 하단에 [space] 만큼의 여백을 추가한다. */
outRect.left = space
outRect.bottom = space
}
}
3. RecyclerView를 사용하는 Activity에 다음 함수 추가하기
fun initRecyclerView(){
val adapter=LikedFoodAdapter() //어댑터 객체 만듦
adapter.datalist=mDatas //데이터 넣어줌
viewBinding.recyclerView.adapter = adapter
viewBinding.recyclerView.run { //**이 부분**
val spanCount = 2
val space = 20
addItemDecoration(GridSpaceItemDecoration(spanCount, space))
}
}
완성
참고 링크
'android' 카테고리의 다른 글
[android] 접근성(accessibility) (0) | 2023.09.11 |
---|---|
[android] NestedScrollView에서 ViewPager2가 슬라이드 이동을 하지 않는 문제 (0) | 2023.09.10 |
[android] ConstraintLayout 화면 비율 유지하기 (0) | 2023.02.18 |
[android] this와 this@ (0) | 2023.02.16 |
[해결하기] TalkBack- focus 부분과 accessiblity 부분 처리 (0) | 2023.01.26 |