hyeals study
RecyclerView 사용법 본문
- RecyclerView란 ?
☞ ListView의 상향&유연한 버전
☞ ListView의 기능들을 모두 사용 가능 + 커스터마이징이 쉬움
- ListView와 RecyclerView의 차이
☞ 위의 사진을 참고해서 ListView와 RecyclerView의 차이를 아래의 표로 정리했음.
ListView | RecyclerView | |
가려지는 뷰 | 삭제 | 새로나타나는 뷰에 재활용 |
새로 나타나는 뷰 | 추가 | 재활용된 뷰 |
☞ 만약 리스트안에 아이템이 많을 경우, ListView는 수 많은 아이템들을 삭제 및 생성을 하게 될 것이며, 이는 뷰를 재활용하는 RecyclerView와 달리 효율성이 좋지 않음.
- Viewholder란?
☞ 뷰를 재활용하기 위해서 처음에 사용한 뷰들을 기억하고 있어야 함. 따라서 이 뷰들에 대한 정보를 가지고 있는 뷰 홀더 객체가 필요.
☞ 여기에 있는 뷰 객체에 대한 데이터들만 바꾸면 재활용이 가능 (뷰 객체는 그대로 데이터만 바뀜)
inner class RecyclerViewHolder(view: View): RecyclerView.ViewHolder(view){
var text_item = view.textView2
}
* 여기서 RecyclerViewHolder가 text_item을 가지고 있음을 기억 (이 부분만 바꿔주면 뷰를 재활용할 수 있음)
- Adapter & LayoutManager
☞ Adapter: 리스트를 RecyclerView에 바인딩 시키기 위한 준비 작업을 하는 객체. (이 Adapter를 직접 만들어서 RecyclerView에 적용하면 됨)
☞ LayoutManager: 화면을 스크롤할 때 방향을 정할 수 있음
[activity_main.xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
[item.xml]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal">
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="일정 목록"
android:layout_marginLeft="10dp"
android:layout_gravity="center_vertical"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<TextView
android:id="@+id/text3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="일정 내용"
android:layout_gravity="center_vertical"
android:layout_marginLeft="10dp">
</TextView>
</LinearLayout>
- 일정 목록 ID: textView2
[MainActivity.kt]
package com.example.calendar
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.activity_main.view.*
import kotlinx.android.synthetic.main.item.view.*
class MainActivity : AppCompatActivity() {
var list = arrayOf("item1", "item2", "item3", "item4", "item5", "item6","item7", "" +
"item8", "item9","item10", "item11", "item12","item13", "item14", "item15","item16", "item17", "item18")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recyclerview.adapter = RecyclerViewAdapter(list)
recyclerview.layoutManager = LinearLayoutManager(this)
}
inner class RecyclerViewAdapter(var data: Array<String>):RecyclerView.Adapter<RecyclerViewHolder>(){
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
var view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
return RecyclerViewHolder(view)
}
override fun getItemCount(): Int {
return data.size
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
holder.text_item.text = data[position]
}
}
inner class RecyclerViewHolder(view: View): RecyclerView.ViewHolder(view){
var text_item = view.textView2
}
}
- 일정 목록 자리에 올 데이터 들을 간단하게 리스트로 만들어 놓음
☞ 생성자로는 리스트로 보여줄 배열을 받음.
☞ RecyclerView.Adapter를 상속하고 제네릭 타입으로 ViewHolder객체를 받아야 함. (RecyclerViewHolder는 Viewholder부분에서 코드를 작성해놓음)
- onCreateViewAdapter: 뷰 홀더가 생성되는 함수(여기에서 Viewholder객체를 만들면 됨). → RecyclerViewHolder에 view객체(item.xml)를 넘겨서 반환.
☞ 뷰 홀더는 이 레이아웃을 인자로 받아서 기억하는 것
- getItemCount: 데이터의 전체 길이 반환하는 함수.
- onBindViewHolder: 재사용되는 뷰 홀더들에 데이터를 바인딩 해주는 함수
☞ holder(RecyclerViewHolder)의 text_item은 view(item.xml)의 textView2(일정 목록 ID)이며, 이 textView의 text를 data(리스트)에 있는 데이터로 바꾸는 것임.
☞ position: 새롭게 보여질 데이터의 인덱스 값
- 마지막으로 RecyclerView에 Adapter와 LayoutManager를 연결하면 됨
[실행 결과]
'안드로이드' 카테고리의 다른 글
오픈 API 데이터 가져오기(XML 문서) (1) | 2020.05.12 |
---|---|
webView 사용해보기 (0) | 2020.05.11 |
인스타그램 클론 (알람 리스트 페이지) (2) | 2020.04.15 |
인스타그램 클론 (알림 이벤트) (0) | 2020.04.14 |
인스타그램 클론 (댓글 페이지) (0) | 2020.04.13 |