안드로이드 토이 프로젝트#1 - RecyclerView 적용
대학교 과제 중 그림판 프로그램을 만들고 (개발새발), 거기에 디자인 패턴을 적용해서 좋은 코드를 만들어 가는 과제를 한 적이 있었다. 처음부터 많은 걸 하지 않고 차근차근 필요한 것들을 알아가는 것이 좋은 공부방법 중 하나라고 생각해서 이번에 개인적으로 안드로이드를 공부 할 때 적용하면 좋겠다고 생각이 들었다.
네이버 API를 이용해서 책 검색을 하는 간단한 TOY프로젝트 할 것이다. 여기서 Retrofit2, GSON, PICASSO, KOIN등 다양한 라이브러리를 써보고, MVVM 패턴을 적용해 갈 것이다.
정리 할 것
Kotlin RecyclerView
Kotlin RecyclerView
1. RecyclerView 정의하기
Reyclerview를 사용하기 위해서는 먼저 gradle에 등록 해줘야 한다.
implementation 'com.android.support:recyclerview-v7:28.0.0'
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="android.support.v7.widget.LinearLayoutManager"></android.support.v7.widget.RecyclerView>
해당 코드는 main_activity.xml에서 layoutManager를 정의해 주었다. LayoutManager를 정해 줌 으로써 해당 RecyclerView의 Layout을 정의해 줄 수 있다.
app:layoutManager="android.support.v7.widget.LinearLayoutManager"
다음 app 정의를 사용하기 위해서는 아래의 코드가 추가 되어야 한다.
xmlns:app="http://schemas.android.com/apk/res-auto"
코드로 정의해 준다면 아래와 같이 적용이 가능하다.
recyclerview.layoutManager = LinearLayoutManager(baseContext)
RecyclerView의 LayoutManager로는 아래와 같이 3개가 있다.
LinearLayoutManager
GridLayoutManager
StaggeredGridLayoutManager
2. ViewHolder 정의
RecyclerView.ViewHolder를 상속 받아 정의 한다. 생성자의 인자로 view를 전달 받는다. 전달 된 view(layout)에서 findViewById로 각 정의된 view들을 찾는다.
class MainViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val imgBook = itemView?.findViewById<ImageView>(R.id.imgBook)
val txtBookName = itemView?.findViewById<TextView>(R.id.txtBookName)
val txtBookPrice = itemView?.findViewById<TextView>(R.id.txtBookPrice)
}
ViewHolder의 bind라는 함수를 통해 전달 받은 데이터를 view에 등록 할 수 있다.
fun bind ( book: Book, context: Context) {
txtBookName.text = book.name
txtBookPrice.text = book.price
}
3. Adapter
RecyclerView.Adapter<ViewHolder>를 상속 받아 정의 한다. <>자리에는 위에서 생성한 ViewHolder가 들어간다.
class MainAdapter (private val context: Context, private var bookList: ArrayList<Book>) : RecyclerView.Adapter<MainViewHolder>() {}
RecyclerView.Adapter를 상속하고 나면, 아래의 3개 함수를 override해야 한다.
onCreateViewHolder
view를 inflate시켜 viewholder를 만들고, 리턴 해주는 함수이다. R.layout.item_recyclerview는 Recyclerview의 아이템으로 사용 될 view이다.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MainViewHolder {
val view = LayoutInflater.from(context).inflate(R.layout.item_recyclerview, parent, false)
return MainViewHolder(view)
}getItemCount
RecyclerView의 아이템의 개수를 리턴
onBindViewHolder
ViewHolder에 해당 포지션의 데이터를 전달해 주는 함수이다. viewholder에 bind라는 함수를 정의해서 구현하였다.
override fun onBindViewHolder(holder: MainViewHolder, position: Int) {
holder.bind(bookList[position], context)
}
4.Recyclerview와 adapter 연결
이제 ViewHodler 설정이 완료 된 Adapter를 RecyclerView에 등록해 볼 것이다. 이는 해당 RecyclerView를 사용하는 화면 클래스에서 이루어 진다. (여기서는 MainActiviet.java) MainAdapter를 생성해 준 뒤, 등록해 주면 된다.
var mainAdapter = MainAdapter(this, bookList)
recyclerview.adapter = mainAdapter
recyclerview.setHasFixedSize(true)
setHasFiexedSize(true)는 item이 추가되거나 삭제 될 때, RecyclerView의 크기가 변경될 수도 있고, 그렇게 되면 계층 구조의 다른 view의 크기가 변경될 가능성이 있기 때문이다. 특히 itemdl 자주 추가/삭제 되면 오류가 날 수 있기 때문에 true로 설정 한다.