Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[Android] RecyclerView 본문

RecyclerView는 ListView의 확장판으로 볼 수 있다.

 

RecyclerView는 Adapter의 ViewHolder를 사용하여 View를 재활용 한다.

 

RecyclerView는 화면에 보이는 View만 생성한다.

 

 

1. Item Layout


각 item이 어떻게 들어갈지 와꾸(?)를 잡아야 한다.

<?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="match_parent">

    <TextView
        android:id="@+id/rv_item"
        android:text="Title"
        android:textSize="30sp"
        android:layout_margin="20sp"
        android:textStyle="bold"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

 

 

 

2. 사용할 Activity에서 RecyclerView 추가


<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

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


</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

3. Adapter 생성


itemLayout과 data를 연결하는 역할

//사용할 data를 받음, RecyclerView의 Adapter 상속
class RvAdapter(val items: MutableList<String>) : RecyclerView.Adapter<RvAdapter.ViewHolder>(){
    
    //ViewHolder객체 생성 및 리턴
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RvAdapter.ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.rv_item, parent, false)
        return ViewHolder(view)
    }

    //RecyclerView는 setOnclickListener제공안함. 직접 선언.
    interface ItemClick{
        fun onClick(view:View, position: Int)
    }
    var itemClick: ItemClick? = null


   //ViewHolder가 재활용 될 때 사용하는 메서드
    override fun onBindViewHolder(holder: RvAdapter.ViewHolder, position: Int) {

       //ionCLick 선언
        if (itemClick != null){
            holder.itemView.setOnClickListener{
                v -> itemClick?.onClick(v, position)
            }
        }
       
       //holder에 item을 bind
        holder.bindItems(items[position])

    }


    //전체 recyclerview 갯수
    override fun getItemCount(): Int {
        return items.size
    }


    //itemView를 들고있는 class, 말 그대로 view를 hold
    class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){

        //각 itemView에 data 매핑
        fun bindItems(item: String){
            val rv_text = itemView.findViewById<TextView>(R.id.rv_item)
            rv_text.text = item
        }
    }
}

 

 

 

4. RecyclerView의 Adpater, LayoutManager 지정


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val items = mutableListOf<String>()
        items.add("A")
        items.add("B")
        items.add("C")

        val rv = findViewById<RecyclerView>(R.id.rv)
        val rvAdapter = RvAdapter(items)
        rv.adapter = rvAdapter
        rv.layoutManager = LinearLayoutManager(this)


        //item click 직접 구현.
        rvAdapter.itemClick = object : RvAdapter.ItemClick{
            override fun onClick(view: View, position: Int) {
               Toast.makeText(baseContext, items[position], Toast.LENGTH_SHORT).show()
            }

        }
    }
}

 

Comments