안드로이드 With Java #23 Recycler View
ListView
를 만드는 한 방법Adapter
보다 나중에 나왔고 Recycler
뷰가 좀 더 최적화 되어있는 것LayoutManager
를 통해서 다양한 형태의 ListView
를 만들 수 있다.ListView
보다 더 효율적Header
와 Footer
를 위한 메소드가 없다.ListView
에서는 Inflater
를 이용해 View
를 만든 후에 간단히 setHeaderView()
, setFooterView()
메소드를 통해 Header
, Footer
를 붙일 수 있었다.AddView
를 활용한 방법item
의 갯수가 많지 않을 때 활용ListView
+ Adapter
를 활용한 방법Header
, Footer
를 좀 더 쉽게 사용하고 싶을 때RecyclerView
를 활용한 방법ListView
의 형태를 테이블과 같이 표현하고 싶을 때ListView
의 item
하나하나에 애니메이션을 입히고 싶을 때기존 다른 방법에서는 Gradle
에 무언가를 추가할 필요가 없었지만, RecyclerView
는 Gradle
에 추가를 해줘야 함
안드로이드 개발자 공식페이지에 RecyclerView 추가하는 방법이 나와있다.
App
단위의 Gradle
을 열어준다.
위와 같이 dependencies
에 추가해준다.
우측 상단에 Sync now
링크를 클릭해주면,
위와 같이 빌드가 성공적으로 되었다는 메세지가 뜬다.
위와 같이 추가했다.
이 단계는 이전에 ListView
의 item
이 표기될 xml을 만드는 것과 동일하다.
이전에 했던 것과 같이 findViewById()
를 이용하여 RecyclerView
를 Layout
으로부터 가져온다.
이전에는 BaseAdapter
를 이용했는데 RecyclerView
에 들어가는 Adapter
는 조금 다르다.
위와 같이 MyAdapter
내부에 ViewHolder
클래스를 추가해주고 그 ViewHolder
클래스는 RecyclerView.ViewHolder
를 상속하게 만든다.
그러면 필수 구현 메소드로 ViewHolder
메소드가 생기는데, 위의 코드처럼 일단은
textView = itemView.findViewById(R.id.item_text);
이렇게 textView
를 가져온다.
위와 같이 상속시키면 된다.
일단 상속시키면 onCreateViewHolder()
, onBindViewHolder()
, getItemCount()
등 기존에 봤던 것 같은 Adapter
필수구현 메소드들이 나온다.
getItemCount()
는 이전에 했던 것처럼 ListView
의 총 item
사이즈를 반환하게 하면 된다.
onCreateViewHolder()
에서는 itemView
로 사용될 xml을 inflate()
시켜서 return
하면 된다.
이전에 ListView
를 만들 때와는 다르게 context
를 생성자에서 안받고, parent.getContext()
를 이용하여 받는다.
근데 여기서 한가지 실수를 해서 화면에 제대로 안보였는데
LayoutInflater
에서inflate
메소드를 쓸 때,root
파라미터 부분을 위의 소스와 같이parent
로 주어야 한다. 안 그러면match_parent
가 적용이 안될 수 있다.
각 item에 들어갈 데이터를 바인딩시키는 부분을 짜주면 된다.
메소드에 ViewHolder
타입의 파라미터가 있기 때문에 그것을 가져와 .View명.set...()
와 같은 형식으로 코딩이 가능하다.
위와 같은 형식으로 LinearLayoutManager
객체의 파라미터에 LinearLayoutManager.HORIZONTAL
을 주면 된다.
딱히 옵션을 주지 않아도 무방하다.
RecyclerView
클래스에 내장된 setLayoutManger()
메소드와 setAdapter()
메소드를 이용하여 적용시킬 수 있다.
스크롤도 잘 된다.
위의 소스를 넣어 가로로도 만들어보았다.
위와 같이 spanCount
에 3
을 주면 3개씩 나온다. 단, Vertical
Horizontal
을 따로 설정해주지 않으면 이번에도 Vertical
을 기본 값으로 하여 나온다.
위와 같이 나온다.
실제 데이터에 setItem()
메소드 등을 사용하여 변화시키고 이전처럼 notifyDataSetChanged()
메소드를 사용하면 된다.