728x90
안드로이드에는 격자 형태로 아이템을 보여주는 GridView 라는 위젯이 존재한다.
하지만 GridView를 사용하는 대신 RecyclerView에 GridLayoutManager 를 설정하여 사용할 수 있다.
val gridLayoutManager = GridLayoutManager(this, 3)
mBinding.recyclerItem.layoutManager = gridLayoutManager
mBinding.recyclerItem.adapter = RecyclerAdapter()
GridLayoutManager 를 생성할 때 파라미터로 context 와 한 줄에 표시해줄 아이템 수인 spanCount 를 입력하면 된다.
GridLayoutManager(this, 3) -> 한 줄에 3개의 아이템을 표시
그 외의 어댑터 연결은 일반 리스트형 RecyclerView 와 같은 방식으로 작성해 연결하면 된다.
또한 아이템의 간격은 RecyclerView에 addItemDecoration()으로 ItemDecoration을 추가해주면 된다.
코드 전체
class MainActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(mBinding.root)
val gridLayoutManager = GridLayoutManager(this, 4)
mBinding.recyclerItem.layoutManager = gridLayoutManager
mBinding.recyclerItem.addItemDecoration(RecyclerItemDecoration(30, 30, 4))
mBinding.recyclerItem.adapter = RecyclerAdapter()
}
inner class RecyclerAdapter() :
RecyclerView.Adapter<RecyclerAdapter.ItemViewHolder>() {
inner class ItemViewHolder(val binding: RecyclerGridItemBinding) : RecyclerView.ViewHolder(
binding.root
)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val binding = RecyclerGridItemBinding.inflate(
LayoutInflater.from(this@MainActivity),
parent,
false
)
return ItemViewHolder(binding)
}
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
val item = resources.getStringArray(R.array.count)[position]
holder.binding.textItem.text = item
}
override fun getItemCount(): Int = resources.getStringArray(R.array.count).size
}
inner class RecyclerItemDecoration(
private val spacing: Int,
private val topSpacing: Int,
private val spanCount: Int
) : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
val index = (view.layoutParams as GridLayoutManager.LayoutParams).spanIndex
val position = parent.getChildLayoutPosition(view)
outRect.left = spacing
outRect.right = spacing
if (position < spanCount)
outRect.top = 0
else
outRect.top = topSpacing
}
}
}
300x250
'개발 > Android' 카테고리의 다른 글
[안드로이드/kotlin] 특정 날짜까지 남은 시간 타이머 만들기(CountDownTimer) (0) | 2022.05.31 |
---|---|
[안드로이드/kotlin] ViewTreeObserver로 View의 크기 구하기 (0) | 2022.05.30 |
[안드로이드/java]scrollview 안에 recyclerview 스크롤 문제 (0) | 2019.08.02 |
[안드로이드/java] BottomSheet 스크롤 할 때 slideOffset 으로 background 조절 (0) | 2019.04.13 |
[안드로이드] TextView 한 줄만 표시하기 (뒷 부분 ... 으로 생략) (0) | 2019.01.16 |