Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발여행일지~

RecyclerView 공부하기!! 본문

코틀린 공부정리

RecyclerView 공부하기!!

야생돌고래 2023. 8. 28. 20:53

RecyclerView는 무엇일까?

  • RecyclerView는 한정적인 화면에 많은 데이터를 넣을 수 있는 View입니다.
  • Recycle을 한국어로 하면 재활용하다라는 뜻입니다.
  • 즉, View를 재활용해서 사용하겠다는 말입니다.

ListView 와 RecyclerView 차이점!

ListView

  • 사용자가 스크롤 할 때마다 위에 있던 아이템은 삭제되고, 맨 아래의 아이템은 생성 되길 반복합니다
  • 아이템이 100개면 100이 삭제 생성됩니다. 즉 계속 삭제와 생성을 반복하므로 성능에 좋지않습니다.

RecyclerView

  • 사용자가 스크롤 할 때, 위에 있던 아이템은 재활용 돼서 아래로 이동하여 재사용 합니다.
  • 즉 아이템이 100개여도 10개정도의 View만 만들고 10개를 재활용해서 사용합니다.
  • View를 계속 만드는 ListView의 단점을 보완하기 위해 나왔습니다.

 

RecyclerView 사용하기위한 

1) Adapter

  • Adapter란 데이터 테이블을 목록 형태로 보여주기 위해 사용되는 것으로, 데이터를 다양한 형식의 리스트 형식을 보여주기 위해서 데이터와 RecyclerView 사이에 존재하는 객체이다.
  • 즉 데이터와 RecyclerView 사이의 통신을 위한 연결체이다.

2) ViewHolder

  • ViewHolder란 화면에 표시될 데이터나 아이템들을 저장하는 역할 입니다.
  • RecyclerView의 개념을 적용하기위해선 스크롤 해서 위로 올라간 View를 재활용하기 위해서 이 View를 기억하고 있어야 합니다. ViewHolder가 그역할을 합니다.

RecyclerView예제

1) MainActivity

package com.example.listapp

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.listapp.MultiData.Companion.TYPE_CONTACT
import com.example.listapp.MultiData.Companion.TYPE_FAVORITE
import com.example.listapp.databinding.ActivityMainBinding
import telAdapter

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val dataList = arrayListOf<MultiData>()
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12345678", MultiData.TYPE_FAVORITE))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12151555", MultiData.TYPE_FAVORITE))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12155155", MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12515155",MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12341551",MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12345676",MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12345677",MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12145888",MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-12185181",MultiData.TYPE_CONTACT))
        dataList.add(MultiData(R.drawable.user,"홍길동", "010-11111111",MultiData.TYPE_CONTACT))

        binding.recyclerView.adapter = telAdapter(dataList)

        val adapter = telAdapter(dataList)
        binding.recyclerView.adapter = adapter
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
    }
}

2) MyAdapter.kt

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.listapp.MultiData
import com.example.listapp.databinding.ItemContactBinding
import com.example.listapp.databinding.ItemFavoriteBinding

class telAdapter(private val itemList: ArrayList<MultiData>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    companion object {
        const val VIEW_TYPE_FAVORITE = 1
        const val VIEW_TYPE_CONTACT = 2
    }

    override fun getItemCount(): Int {
        return itemList.size
    }

    override fun getItemViewType(position: Int): Int {
        return if (itemList[position].type == MultiData.TYPE_FAVORITE) {
            VIEW_TYPE_FAVORITE
        } else {
            VIEW_TYPE_CONTACT
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val inflater = LayoutInflater.from(parent.context)

        return if (viewType == VIEW_TYPE_FAVORITE) {
            val binding = ItemFavoriteBinding.inflate(inflater, parent, false)
            FavoriteHolder(binding)
        } else {
            val binding = ItemContactBinding.inflate(inflater, parent, false)
            ContactHolder(binding)
        }
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val item = itemList[position]
        if (holder is FavoriteHolder) {
            holder.bind(item)
        } else if (holder is ContactHolder) {
            holder.bind(item)
        }
    }

    inner class FavoriteHolder(private val binding: ItemFavoriteBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(item: MultiData) {
            binding.fvIcon.setImageResource(item.aIcon)
            binding.fvUserid.text = item.aName
            binding.fvTxtUsername.text = item.aTel
        }
    }

    inner class ContactHolder(private val binding: ItemContactBinding) :
        RecyclerView.ViewHolder(binding.root) {
        fun bind(item: MultiData) {
            binding.imgUserIcon.setImageResource(item.aIcon)
            binding.txtUserId.text = item.aName
            binding.txtUserName.text = item.aTel
        }
    }
}

 

 

3) activity_main

 

<?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="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/favorite"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20dp"
        android:text="즐겨찾기" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
        
        </LinearLayout>

 

실행결과