상세 컨텐츠

본문 제목

안드로이드(ANDROID) - 리사이클러뷰(RecyclerView)를 통한 ListView 사용 방법(2)

Android 자료실/기능 개발

by Victorywskim 2020. 3. 31. 18:43

본문

반응형

이전 게시물로 이동

 

지난번에는 리사이클러뷰를 이용해서 리스트를 만드는 작업까지 완료하였다.

 

이번에는 리사이클러뷰의 리스트를 터치했을시 발생하는 이벤트에 대한 내용을 다뤄보려한다.

 

이전 작업에서 이미 어뎁터 쪽에 setOnClickListener를 통해 이벤트를 발생시켰었다.

 

하지만 어뎁터에서 많은 작업을 다루기에는 무리가 있다.

예를 들어서 엑티비티의 생명주기를 이용한다던지, 엑티비티의 뷰와 상호작용이 필요한 경우가 있을것같다.

 

그래서 이런 경우에 어떻게 하면 어뎁터가 아닌 엑티비티에서 이벤트를 감지할 수 있는지 알아보도록 하자

 

1. 가장 먼저 인터페이스 파일을 생성한다.

interface UtilListItemListener {
    fun onClick(position : Int, title: String)
}

우선 클릭 시에 궁금한 내용이 리스트의 위치와 내용이라고 가정하고 위치와 타이틀을 받아보도록 하겠다.

 

2. 어뎁터에 리스너를 연결해준다.

var utilListItemListener : UtilListItemListener? = null

fun setOnUtilListItemListener(utilListItemListener : UtilListItemListener){
    this.utilListItemListener = utilListItemListener
}

우선 상단에 리스너 부분을 만들어준다.

 

holder.itemView.setOnClickListener {
//            Toast.makeText(context, "클릭 $position", Toast.LENGTH_SHORT).show()
    if(utilListItemListener != null){
        utilListItemListener!!.onClick(position, item.utilTitle!!)
    }
}

그리고 실제 클릭이 발생하는 부분에 리스너의 이벤트를 추가한다.

 

추가한 코드는 위의 2가지가 전부이며, 전체소스는 다음과 같다.

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import wskim.android.utilcollection.R

class UtilListAdapter(private val context: Context) : RecyclerView.Adapter<UtilListAdapter.UtilViewHolder>() {

var utilListItemListener : UtilListItemListener? = null

fun setOnUtilListItemListener(utilListItemListener : UtilListItemListener){
    this.utilListItemListener = utilListItemListener
}

    var utilList: ArrayList<UtilListItem>? = null
    fun setItemList(utilList: ArrayList<UtilListItem>){
        this.utilList = utilList
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): UtilViewHolder {
        return UtilViewHolder(LayoutInflater.from(context).inflate(R.layout.util_list_item, parent, false))
    }

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

    override fun onBindViewHolder(holder: UtilViewHolder, position: Int) {
        val item = utilList!![position]

        holder.utilItemNo.text = (position + 1).toString()
        holder.utilItemTitle.text = item.utilTitle
        holder.utilItemMsg.text = item.utilMsg

//        holder.itemView.layoutParams = RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)

        holder.itemView.setOnClickListener {
        //            Toast.makeText(context, "클릭 $position", Toast.LENGTH_SHORT).show()
            if(utilListItemListener != null){
                utilListItemListener!!.onClick(position, item.utilTitle!!)
            }
        }
    }

    inner class UtilViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val utilItemNo: TextView = view.findViewById(R.id.util_item_no)
        val utilItemTitle: TextView = view.findViewById(R.id.util_item_title)
        val utilItemMsg: TextView = view.findViewById(R.id.util_item_msg)
    }
}

 

3. 메인에 이벤트 리스너를 생성하고 어댑터에 연결해준다.

 

메인에서 리스너의 이벤트를 받는 방법도 여러개 있으나 내가 가장 선호하는 방법은 리스너를 별도로 분리하는 것이다.

private fun utilListItemListener() = object : UtilListItemListener{
    override fun onClick(position: Int) {
        Toast.makeText(this@MainActivity, "리스트 위치: $position, 타이틀: $title", Toast.LENGTH_SHORT).show()
    }
}

위와 같이 리스너를 하나 생성한 뒤에

val item = UtilListAdapter(this).apply {
    setItemList(getListData())
    setOnUtilListItemListener(utilListItemListener())
}

마지막으로 기존에 생성해두었던 어뎁터의 setOnUtilListItemListener에 연결해주었다.

 

전체 소스는 다음과 같다.

import android.os.Bundle
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.activity_main.*
import wskim.android.utilcollection.R
import wskim.android.utilcollection.main.adapter.UtilListAdapter
import wskim.android.utilcollection.main.adapter.UtilListItem
import wskim.android.utilcollection.main.adapter.UtilListItemListener

class MainActivity : AppCompatActivity() {

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

        val item = UtilListAdapter(this).apply {
            setItemList(getListData())
            setOnUtilListItemListener(utilListItemListener())
        }

        util_list.apply {
            // 리스트에 밑줄이 필요하면 아래 주석 제거
//            addItemDecoration(DividerItemDecoration(this@MainActivity, DividerItemDecoration.VERTICAL))
            layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false)
            adapter = item
        }
    }

    private fun utilListItemListener() = object : UtilListItemListener{
        override fun onClick(position: Int, title: String) {
            Toast.makeText(this@MainActivity, "리스트 위치: $position, 타이틀: $title", Toast.LENGTH_SHORT).show()
        }
    }

    private fun getListData() : ArrayList<UtilListItem>{
        val result = ArrayList<UtilListItem>()
        result.add(UtilListItem(
            "pip 기능"
        ,"유튜브와 같은 pip 기능입니다."
        ))
        for(i in 1 until 20){
            result.add(UtilListItem(
                "유틸$i"
                ,"설명 블라블라"
            ))
        }
        return result
    }
}

 

작업은 마무리 되었고 잘 실행되는지 확인해보자

 

실행 화면이다.
잘 불러와진다.

정상 작동되는 것을 확인할 수 있다.

 

이상으로 리스트뷰의 클릭 이벤트에 대한 내용을 마치겠다.

728x90
반응형

관련글 더보기