728x90
반응형

리스트뷰는 유사하게 반복되는 뷰를 그리기 위한 도구이다. 리스트뷰는 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로 활용할 수 있어 유연하게 활용 가능하다. 

https://stackoverflow.com/questions/34216890/android-difference-between-gridlayout-and-staggered-gridlayout

 

Android - Difference between Gridlayout and Staggered Gridlayout

I am working in android material design api & want to display some data in grid format. I tried both GridLayout and StaggeredGridlayout and both look same. For general information, i want to as...

stackoverflow.com

앞으로 개발할때 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: 스크롤 위아래로 할지, 좌우로 할지 이런거 결정

728x90
반응형

'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

+ Recent posts