seops

[RecyclerView] Compare RecyclerView with ListView 본문

Android/Android

[RecyclerView] Compare RecyclerView with ListView

seops 2020. 10. 31. 16:36

진짜 오랜만에 블로그에 포스팅을 한다.

그동안... 러시아 대응 때문에, 근무 시간을 바꾼 나머지... 

 

아무튼 오늘은 RecyclerView와 ListView의 차이점을 확인해 보려고 한다.

 

RecyclerView의 경우, ListView의 Flexible 한 버전이다.

 

1. ViewHolder


"Allow us to make our list scrolling act smoothly"

 

- RecyclerView.Adapter의 경우, ViewHolder 패턴을 필수로 한다.

- 또한, ViewHolder의 생성과 업데이트 메소드가 분리되어 있다.

  ( 생성 : onCreateViewHodler  / 업데이트 : onBindViewHolder )

- ListView의 경우, ViewHolder의 사용이 필수는 아니며, getView() 메서드 내, ViewHolder 패턴을 Implements 하지 않으면 비효율적인 스크롤링이 된다.

 

 

2. LayoutManager


"Allow us to choose the way that we want to show the row views and how to scroll the list"

 

- LayoutManager의 경우, 아이템들의 배치를 담당한다.

- LinearLayoutManager (can scroll vertical/horizontal)와 GridLayoutManager 등이 존재한다.

- ListView의 경우, Vertical-Scrolling List만 사용이 가능하다.

 

 

3. Notifying Adapter


- 데이터의 변화와 관련된 Method

- RecyclerView.Adapter.notifyDataSetChanged() 뿐 만 아니라, notifyItemInserted(), notifyItemRemoved(), notifyItemChanged()가 있다.

- ListView의 경우, notifyDataSetChanged() 만 있다.

 

 

4. ETC


1) ItemDecoration

 - RecyclerView.ItemDecoration을 이용해, List를 Decorate 해주는 기능 ( ex. 리스트 내, Divider 추가 )

 - 참고 URL : black-jin0427.tistory.com/102

 

[Android, ItemDecoration] 리사이클러뷰에 아이템데코레이션 사용하기

안녕하세요. 블랙진입니다. 리사이클러뷰에서 아이템 여백을 주는 방법으로 ItemDecoration 을 사용하면 좀 더 유연하게 적용해 줄수 있습니다. 먼저 아래와 같은 그리드 레이아웃이 있습니다. 현

black-jin0427.tistory.com

 - Code with Kotlin

[ TextItemDecorator ]

package com.seosh.simpletest.adapter.decorator

import android.content.Context
import android.graphics.Rect
import android.util.TypedValue
import android.view.View
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView

class TextItemDecorator(private val context: Context) : RecyclerView.ItemDecoration() {
    private var SIZE_5 = 0
    private var SIZE_10 = 0

    init {
        SIZE_5 = dpToPixel(5f)
        SIZE_10 = dpToPixel(10f)
    }

    /***
     * 코드를 통해 View 사이즈에 변화를 주거나, 여백을 설정해 줄 때는 Pixel 단위로 변환해 작업을 해줘야 한다.
     */
    private fun dpToPixel(dp: Float) : Int {
        return TypedValue.applyDimension(
            TypedValue.COMPLEX_UNIT_DIP, dp, 
            context.resources.displayMetrics).toInt()
    }


    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        super.getItemOffsets(outRect, view, parent, state)

        // Get Position from each items
        val position = parent.getChildAdapterPosition(view)

        // Get Total items count
        val itemCount = state.itemCount

        when(position) {
            // First item in RecyclerView(GridLayoutManager)
            0, 1 -> {
                outRect.top = SIZE_10
                outRect.bottom = SIZE_10
            }

            else -> {
                outRect.bottom = SIZE_10
            }
        }

        val layoutParams = view.layoutParams as GridLayoutManager.LayoutParams

        // Left item spanIndex == 0 / Right item spanIndex == 1
        val spanIndex = layoutParams.spanIndex

        with(outRect) {
            when(spanIndex) {
                0 -> {
                    left = SIZE_10
                    right = SIZE_5
                }

                1 -> {
                    left = SIZE_5
                    right = SIZE_10
                }
            }
        }
    }
}

 

[ ListActivity ] 

package com.seosh.simpletest

import android.os.Bundle
import android.widget.GridLayout
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.seosh.simpletest.adapter.TextAdapter
import com.seosh.simpletest.adapter.data.TextItem
import com.seosh.simpletest.adapter.decorator.TextItemDecorator
import com.seosh.simpletest.databinding.ActivityListBinding
import org.w3c.dom.Text

class ListActivity : AppCompatActivity() {
    private var textList = ArrayList<TextItem>()

    lateinit var textAdapter: TextAdapter
    lateinit var gridLayoutManager: GridLayoutManager

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

        val binding : ActivityListBinding 
        	= DataBindingUtil.setContentView(this@ListActivity, R.layout.activity_list)

        with(binding){
            setLayout(this)
        }
    }

    private fun setLayout(binding: ActivityListBinding) {
        gridLayoutManager = GridLayoutManager(this@ListActivity, 2)
        textAdapter = TextAdapter()

        binding.recyclerViewList.apply {
            layoutManager = gridLayoutManager
            addItemDecoration(TextItemDecorator(this@ListActivity))
            adapter = textAdapter
        }

        textList.apply {
            add(TextItem("adsfa"))
            add(TextItem("asdasd"))
            add(TextItem("eqrere"))
            add(TextItem("adsfa"))
            add(TextItem("asdasd"))
            add(TextItem("eqrere"))
            add(TextItem("adsfa"))
            add(TextItem("asdasd"))
            add(TextItem("eqrere"))
        }

        textAdapter.submitList(textList)
    }
}

 

 

2) ItemAnimator

 - It's handling row views animations like list appearance and disappearence, adding or removing particular views and so on.

 - 참고 URL : github.com/wasabeef/recyclerview-animators

 

wasabeef/recyclerview-animators

An Android Animation library which easily add itemanimator to RecyclerView items. - wasabeef/recyclerview-animators

github.com

 

오늘은 여기까지~ :)

'Android > Android' 카테고리의 다른 글

[RxJava] 02. RxJava Open Source  (0) 2020.11.24
[RxJava] 01. Basic Concepts for RxJava  (0) 2020.11.18
[RecyclerView] 2. SimpleRecyclerView  (0) 2020.10.22
[RecyclerView] 1. RecyclerView and DiffUtil  (0) 2020.10.20
[Callback] 2. Singleton Class  (0) 2020.10.12
Comments