안드로이드/AdapterView

안드로이드 RecyclerView

김어찐 2022. 6. 7. 18:24
728x90

Android 5.0 때 추가된 View 이다.
ListView와 GridView의 구현이 비슷한 부분이 많이 이를 통합한 View이다.
RecyclerView는Adapter를 직접 구현해 줘야 하며 이를 통해 항목을 자유롭게 구성할 수 있다.
RecyclerView는 반드시 항목들을 어떠한 형태로 보여줄 것인가를 설정해야 한다.

 

ViewHoler 만들기

ViewHolder 클래스는 항목 하나를 구성하는 View 들의 주소 값을 가지고 있는 클래스이다.
이 클래스는 RecyclerView의 Adapter 클래스 내부에 구현하여 준다.

 

inner class ViewHolderClass(itemView : View) : RecyclerView.ViewHolder(itemView) {
   
val rowImageView = itemView.rowImageView
   
val rowTextView = itemView.rowTextView

}

RecyclerView의 Adapter 클래스

RecyclerView는 RecyclerView.Adapter 클래스를 상속받은 클래스를 작성하여 Adapter를 구성해야 한다.
onCreateVeiwHolder :  RecyclerView는 항목 하나를 구성하기 위해 ViewHolder를 사용한다. ViewHolder는 항목 내부를 구성하는 View 객체들을 관리하는 객체로 ViewHolder를 생성하고자 할 때 이 메서드를 호출한다.
onBindViewHolder : 항목을 구성하기 위해 호출한다. 여기에서 ViewHolder가 가지고 있는 View들을 구성해준다.

getItemCount : RecyclerView의 항목의 개수를 반환한다.

 

RecyclerView의 항목 배치

RecyclerView는 ListView와 GridView를 통합한 View이다. 따라서 ListView 처럼 보여줄 것인지 GridView 처럼 보여줄 것인지 결정해야 한다.
LinearLayoutManager : ListView 처럼 항목을 보여준다.
GridLayoutManager : GridView 처럼 항목을 보여준다.
StaggerGridLayoutManager : GridView 처럼 보여주지만 완전한 그리드가 아닌 각 항목의 크기에 따라 유동적으로 조절된다.

 

package com.example.recyclerview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.StaggeredGridLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.row.view.*

class MainActivity : AppCompatActivity() {

    var imgRes = intArrayOf(
            R.drawable.imgflag1,R.drawable.imgflag2,R.drawable.imgflag3,R.drawable.imgflag4,
            R.drawable.imgflag5,R.drawable.imgflag6,R.drawable.imgflag7,R.drawable.imgflag8,
    )

    var data1 = arrayOf(
            "토고","프랑스 문자열을 길게 작성해주세요","스위스","스페인","일본 문자열을 길게 작성해주세요","독일","브라질","대한민국"
   )
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val adapter1 = RecyclerAdapter()
        recycler1.adapter = adapter1

//        recycler1.layoutManager = LinearLayoutManager(this)
//        recycler1.layoutManager = GridLayoutManager(this,2)
//        recycler1.layoutManager = StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)
        recycler1.layoutManager = StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.HORIZONTAL)
    }

    //  RecyclerView의 Adapter 클래스
    inner class RecyclerAdapter : RecyclerView.Adapter<RecyclerAdapter.ViewHolderClass>(){

        // 항목 구성을 위해 사용할 ViewHolder 객체가 필요할 떄 호출되는 메서드
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderClass {
            // 항목으로 사용할 View 객체를 생성한다.
            val itemView = layoutInflater.inflate(R.layout.row,null)
            val holder = ViewHolderClass(itemView)
            itemView.setOnClickListener(holder)
            return holder
        }

        // ViewHolder를 통해 항목을 구성할 떄 항목 내의 View 객체에 데이터를 셋팅한다.
        override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {
            holder.rowImageView.setImageResource(imgRes[position])
            holder.rowTextView.text = data1[position]
        }

        // RecyclerView 항목 개수를 반한
        override fun getItemCount(): Int {
            return imgRes.size
        }

        //ViewHolder 클래스
        inner class ViewHolderClass(itemView: View) : RecyclerView.ViewHolder(itemView),View.OnClickListener {
            // 항목 View 내부의 View 객체의 주소값을 담는다
            val rowImageView = itemView.rowImageView
            val rowTextView = itemView.rowTextView

            override fun onClick(v: View?) {
                textView.text = data1[adapterPosition]
            }
        }


    }
}

 

728x90