RecyclerView 만으로는 화면에 출력되지 않는다.
implementation'androidx.recyclerview:recyclerview:1.2.1'
activity_main.xml에 아래와 같이 RecyclerView를 추가해주었다.
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
여기서는 item_main.xml 파일에 아래와 같이 작성한다. 액티비티로 만들 필요 없고 레이아웃 파일만 만들어주면 된다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_root"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/item_data"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textStyle="bold"
android:text="temp"/>
</LinearLayout>
내부에 넣을 아이템에 해당하는 클래스를 생성해준다. 여기서는 간단하게 문자열 text 하나만을 가진다.
data class Item(
var text: String? = ""
)
어댑터는 뷰 홀더의 뷰에 데이터를 출력해 각 항목을 만들어 주는 역할을 한다.어댑터는 RecyclerView.Adapter를 상속받아 작성한다.
여기서는 뷰홀더를 어댑터 내부의 inner class로 생성해주었다. 뷰홀더는 RecyclerView.ViewHolder를 상속받아 작성한다.
class MyAdapter(private val itemList: ArrayList<Item>) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
// 뷰 홀더 클래스
inner class MyViewHolder(private val binding: ItemMainBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: Item) {
binding.itemData.text = item.text
}
}
// ViewHolder 객체를 생성하여 리턴
override fun onCreateViewHolder(viewGroup: ViewGroup, viewType: Int): MyAdapter.MyViewHolder {
val binding: ItemMainBinding =
ItemMainBinding.inflate(LayoutInflater.from(viewGroup.context), viewGroup, false)
return MyViewHolder(binding)
}
// 데이터 갯수 리턴
override fun getItemCount(): Int = itemList.size
// ViewHolder 안의 내용을 position에 해당되는 데이터로 교체한다.
override fun onBindViewHolder(holder: MyAdapter.MyViewHolder, position: Int) {
holder.bind(itemList[position])
}
}
리사이클러 뷰에 어댑터와 레이아웃 매니저를 등록해 화면에 출력한다.
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
var list = ArrayList<Item>()
for(i in 1..10){
list.add(Item("item $i"))
}
val myAdapter = MyAdapter(list)
binding.recyclerview.adapter = myAdapter
binding.recyclerview.layoutManager = LinearLayoutManager(applicationContext)
binding.recyclerview.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))
}
}
// 동적으로 데이터 추가
list.add(Item("new Item"))
myAdapter.notifyDataSetChanged()
레이아웃 매니저는 어댑터로 만든 항목을 RecyclerView에 배치한다. RecyclerView.LayoutManager를 상속받아 만든다.
항목을 가로나 세로 방향으로 배치한다.
binding.recyclerview.layoutManager = LinearLayoutManager(this)
val layoutManager = LinearLayoutManager(this)
layoutManager.orientation = LinearLayoutManager.HORIZONTAL
binding.recyclerview.layoutManager = layoutManager
항목을 그리드로 배치한다.
GridLayoutManager의 두번째 파라미터는 column의 개수이다. 방향도 설정할 수 있으며, 기본은 세로이다.
val layoutManager = GridLayoutManager(this, 2)
binding.recyclerview.layoutManager = layoutManager
val layoutManager = GridLayoutManager(this, 3, GridLayoutManager.HORIZONTAL, false)
binding.recyclerview.layoutManager = layoutManager
GridLayoutManager처럼 그리드로 배치하며, 각 뷰의 크기가 다르면 지그재그 형태로 배치한다.
val layoutManager = StaggeredGridLayoutManger(2, StaggeredGridLayoutManger.VERTICAL)
binding.recyclerview.layoutManager = layoutManager