관리 메뉴

hyeals study

RecyclerView 사용법 본문

안드로이드

RecyclerView 사용법

hyeals 2020. 5. 11. 18:35

- 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
    }

 

* 여기서 RecyclerViewHoldertext_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>

 

item.xml

- 일정 목록 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
    }

}

일정 목록에 대한 아이템 리스트

 

- 일정 목록 자리에 올 데이터 들을 간단하게 리스트로 만들어 놓음


RecyclerViewAdapter

 

☞ 생성자로는 리스트로 보여줄 배열을 받음.

 

RecyclerView.Adapter를 상속하고 제네릭 타입으로 ViewHolder객체를 받아야 함. (RecyclerViewHolder는 Viewholder부분에서 코드를 작성해놓음)

 

- onCreateViewAdapter: 뷰 홀더가 생성되는 함수(여기에서 Viewholder객체를 만들면 됨). → RecyclerViewHolderview객체(item.xml)를 넘겨서 반환.

 뷰 홀더는 이 레이아웃을 인자로 받아서 기억하는 것

 

- getItemCount: 데이터의 전체 길이 반환하는 함수.

 

- onBindViewHolder: 재사용되는 뷰 홀더들에 데이터를 바인딩 해주는 함수

holder(RecyclerViewHolder)text_item은 view(item.xml) textView2(일정 목록 ID)이며, 이 textView의 text를 data(리스트)에 있는 데이터로 바꾸는 것임.

position: 새롭게 보여질 데이터의 인덱스 값


 

- 마지막으로 RecyclerViewAdapter와 LayoutManager를 연결하면 됨


[실행 결과]

 

 

Comments