리스트뷰는 유사하게 반복되는 뷰를 그리기 위한 도구이다. 리스트뷰는 3가지 방법으로 그릴 수 있다.
1. AddView
AddView는 실제로 리스트뷰를 그리기위해서 잘 사용되지는 않는다. AddView는 Item을 담을 xml을 만들어 주고 그 xml에 내용을 채워주어 Container View에 더해준다. 이 작업을 계속 반복한다.
2. ListView
ListView는 리스트로 만들고 싶은 아이템의 리스트를 준비한 뒤 Inflater로 아이템 하나에 해당하는 뷰를 만들어 준다. 여기서 만든 뷰를 컨테이너 뷰에 붙여준다. Adapter를 사용하게 된다. AddView와의 다른점은 AddView는 리스트의 갯수와 상관없이 한번에 다 그리고 ListView는 보여지는 부분만 그리고 필요한 경우(스크롤을 내릴때) 더 그리게 된다.
3. RecyclerView
RecyclerView의 장점은 ListView의 개선판이다. ViewHolder를 포함하기 때문에 RecyclerView를 사용하면 무조건 ViewHolder를 사용하게 된다. 그리고 LayoutManager를 관리할 수 있다. LayoutManager는 Linear, Grid, StaggerGrid로 활용할 수 있어 유연하게 활용 가능하다.
앞으로 개발할때 ListView를 만들경우 RecyclerView를 사용하고 이전에 만들어진 ListView, AddView는 알아야 유지보수 가능하기 때문에 배워야 한다.
(RecyclerView를 사용하려면 먼저 dependencies에서 recyclerview를 import시켜줘야한다.)
1. 메인엑티비티에 Recyclerview 추가
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
2. ItemView 레이아웃 추가
3. Recyclerview Adapter 구현-> class를 새로 만들어서 onCreate에 붙여준다.
- RecyclerView.Adapter를 상속하여 구현
- 오버라이드 필요한 메서드
onCreateViewHolder(ViewGroup parent, int viewType) | viewType 형태의 아이템 뷰를 위한 뷰홀더 객체 생성. |
onBindViewHolder(ViewHolder holder, int position) | position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시. |
getItemCount() | 전체 아이템 갯수 리턴. |
흐름
1) onCreateViewHolder에서 view를 만든것을 viewholder에 넣어준다(아이템 하나씩)
2) viewholder에서 init으로 carname, carengine만 설정
3) onBindViewHolder에서 setText로 내용 설정
class RecyclerViewAdapter(
val itemList:ArrayList<CarForList>,
val inflater:LayoutInflater
):RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>(){
inner class ViewHolder(itemView: View):RecyclerView.ViewHolder(itemView){
val carName:TextView
val carEngine:TextView
init{
carName=itemView.findViewById(R.id.car_name)
carEngine=itemView.findViewById(R.id.car_engine)
itemView.setOnClickListener {
val position:Int = adapterPosition
val engineName = itemList.get(position).engine
Log.d("engine",engineName)
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = inflater.inflate(R.layout.item_view,parent,false)
return ViewHolder(view)
}//ViewHolder생성되는 함수
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.carName.setText(itemList.get(position).name)
holder.carEngine.setText(itemList.get(position).engine)
}//생성된 뷰홀더에 데이터를 바인딩 해주는 함수
override fun getItemCount(): Int {
return itemList.size
}
}
4. Adapter, LayoutManager 지정
- 어뎁터에 대한 객체와 레이아웃매니저의 객체를 생성한 다음, 각 객체를 setAdapter() 메서드와 setLayoutManager() 메서드를 통해 RecyclerView에 지정한다.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler_view)
val carList = ArrayList<CarForList>()
for(i in 0 until 100) {
carList.add(CarForList("" + i + "번째 자동차", "" + i + "순위 엔진"))
}
val adapter = RecyclerViewAdapter(carList, LayoutInflater.from(this@RecyclerViewActivity))
recycler_view.adapter=adapter
recycler_view.layoutManager=LinearLayoutManager(this@RecyclerViewActivity)
// recycler_view.layoutManager=GridLayoutManager(this@RecyclerViewActivity,2)
}
ViewHolder : 뷰객체를 기억하고 있을 객체
Adapter : 모든 아이템이 담긴 리스트를 RecyclerView에 Binding 시켜주기 위한 사전 작업이 이루어 지는 객체
LayoutManager: 스크롤 위아래로 할지, 좌우로 할지 이런거 결정
'App > Android' 카테고리의 다른 글
[2] Kotlin (0) | 2022.03.08 |
---|---|
[1] Android 소개 (0) | 2022.03.08 |
Fragment (0) | 2021.08.23 |
Intent (0) | 2021.08.23 |
첫 프로젝트 만들기 (0) | 2021.03.07 |