[TIL] 230809 회고

서정한·2023년 8월 9일
0

내일배움캠프 7기

목록 보기
28/66

Intro

  • 어제까지는 내가 뭘 구현하려고하는지 그걸 하려면 어떻게해야하는지 이해하고 구현하는데 힘을쏟았다면 오늘부터는 내가 구현한게 내부적으로 어떤마법(?)을 부리고있는지 살펴보는 시간을 가졌다.

RecyclerView

  • 리사이클러뷰가 생겨나게 된 배경을 살펴보게되었다. 블로그들을 보며 공부하는데 누가 그런글을 썼더라.

    내가 쓰는 기술을 이해하고싶으면 그게 없었을때 어떻게 구현했는지를 보면 된다.

  • RecyclerView는 아래와 같이 구현된다.
    1. xml에 RecyclerView를 선언한다.(나는 TabLayout + ViewPager2를 사용했기에 fragment에 구현했다)
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".TodoFragment">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_todo_fragment"
        android:layout_width="match_parent"
        tools:listitem="@layout/item_todo_recyclerview"
        android:layout_height="match_parent" />

</FrameLayout>
  1. item을 만든다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_margin="10dp"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv_item_element"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:text="todo" />

</androidx.constraintlayout.widget.ConstraintLayout
  1. Adapter를 구현한다.
class RecyclerviewAdapter :RecyclerView.Adapter<RecyclerviewAdapter.viewHolder>(){

    class viewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val elementText: TextView = view.findViewById(R.id.tv_item_element)
    }

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): RecyclerviewAdapter.viewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_todo_recyclerview, parent, false)
        val holder = viewHolder(view)
        return holder
    }

    override fun onBindViewHolder(holder: RecyclerviewAdapter.viewHolder, position: Int) {
        holder.elementText.text = "todo"
    }

    override fun getItemCount(): Int {
        return 100
    }

}
  1. 사용할 곳에가서 recyclerView를 xml과 연결해 가져오고 adapter 연결 후 원하는 Layout 형태를 설정해준다.
class TodoFragment : Fragment() {
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_todo, container, false)
        val recyclerview: RecyclerView = view.findViewById(R.id.rv_todo_fragment)
        val adapter = RecyclerviewAdapter()
        recyclerview.adapter = adapter
        recyclerview.layoutManager = LinearLayoutManager(view.context, LinearLayoutManager.VERTICAL,false)
        return view
    }
}

왜 이런형태로 구현하게 되었을까?

  • 이전에 안드로이드에서 스크롤가능한 List목록을 보여주기위해서는 ListView를 사용했다고한다. 원래 ListView를 구현해보지않아 뭐가 단점인지 와닿지 않았는데 설명들을보면 ListView의 단점을 보완한 것이 바로 RecyclerView라고 한다.(ListView는 내일 한번 구현해봐야겠다.)
  • ListView의 가장 큰 단점은 재사용성이라고 한다. 기존 ListView는 view가 스크롤될때 객체를 파괴하고 생성하는일을 계속 반복한다. 그러다보니 리소스낭비가 심했고 이를 피하기위한 방법으로 ViewHolder패턴이라는것을 사용하기 시작했다.
  • ViewHolder패턴은 view에서 쓰일 item을 생성할때 ViewHolder라는 객체에 저장해놨다가 필요할때 다시 불러와 사용하는것이다. 이렇게되면 매번 findViewById를 하지 않아도되고, 이미 생성한 item은 다시 그릴 필요없이 불러와 사용하기만하면 되는것이다.(이것도 내일 직접 구현해보면서 뭐가 차이인지 파악해보려고 한다 ㅠ)
  • RecyclerView는 ListView에 ViewHolder 패턴과 LayoutManager를 의무사용하게하여 이전보다 성능적으로도 뛰어난 사용을 할 수 있도록 만들어준 것이다. 여기까지가 내가 현재 이해한 정도이고 내일 좀더 들어가보려고 한다.

ViewPager2

  • ViewPager2는 내부적으로 RecyclerView를 사용한다. 이전 ViewPager의 경우 몇가지 불편한 사항이 있다고 한다.
    • Right-to-left(오른쪽에서 시작해 왼쪽으로 화면배치) layout을 지원하지 않았다.
    • vertical Orientation 미지원
    • Modifiable Fragment Collections(데이터 변경시 뷰가 갱신되지 않는 이슈라는데 잘 모르겠다)
  • 그래서 RecyclerView에대한 이해가 뒷받침되어야 ViewPager2에 대한 이해도가 올라갈 것같다.

LayoutInflater

  • 이것도 좀 찾아봤는데 아직 정리는 되지 않았다만 알고있는것까지만 정리해보고 넘어가려고 한다.
  • LayoutInflater는 우리가 작성한 xml 틀을 실제 메모리에 올려주는 일을 한다. 즉, MainActivity의 setContentView(R.layout.activity_main)도 내부적으로는 inflater를 사용하여 메모리에 xml 틀을 올리고 있는 것이다.
  • inflater는 View 타입이다. findViewById 역시 view타입에서만 사용할 수 있다.
  • android에서 View는 상당히 크고 복잡한 클레스로 알고있다..

Outro

  • 써놓고보니 이 역시 수박겉핧기 느낌의 수준이라는 생각이 많이든다.
  • 서론정도만 알게 된 수준이고 실제 내부동작과정으로 이제서야 조금씩 들어가고있다는 생각이다.
  • 내가 여기 적어놓은 ViewHolder 패턴, RecyclerView, inflater, ViewPager2, TabLayout 등의 동작을 이해한다면 내가 할 프로젝트에서 해당기술을 사용할때 더 유용하게 쓸 수 있을것에대한 기대가 있다.
  • 내부동작을 이해하는것은 만든 사람들의 의도를 파악하는일이라 한글로 다른사람들이 한 설명을 읽고 또 읽어도 어려운 일인것같다. 반복해서 익숙해지면 좀 낫지않을까하는 행복회로를 돌려본다 끗!
profile
잘부탁드립니다!

0개의 댓글