[Kotlin] recyclerView에 클릭 이벤트 적용

호우·2022년 8월 2일
0

코틀린

목록 보기
8/8

이번 포스팅에서는 recyclerview에 클릭 이벤트를 적용해 다음 화면으로 넘어갈 수 있는 부분을 구현해봤습니다.

recyclerview는 별도의 클릭 이벤트가 없어서 따로 설정을 해주어야 합니다.
저는 recyclerview에 나타날 cardview에 클릭 이벤트를 입력했습니다.
중간에 Toast와 Log 부분을 통해 눌렸는지 아닌지 확인해보고자 했습니다.

 //레이아웃 내 View 연결
   inner class ViewHolder(itemView : View): RecyclerView.ViewHolder(itemView){
        private val itemtitle  = itemView?.findViewById<TextView>(R.id.item_title)
        private val itemdetail = itemView?.findViewById<TextView>(R.id.item_detail)
        private val itemImage = itemView?.findViewById<ImageView>(R.id.item_image)
        private val cardView = itemView?.findViewById<CardView>(R.id.card_view_small)

        fun bind(item: ItemInfoDTO){
            itemtitle?.text = item.item_name
            itemdetail?.text = item.item_text

            if (itemImage != null) {
                GlideApp.with(itemView)
                    .load(item.imageUri)
                    .into(itemImage)
            }
            cardView?.setOnClickListener { View ->
                Toast.makeText(context, "카드뷰 클릭됨", Toast.LENGTH_SHORT).show()
                Log.e("check", "카드뷰 클릭")
                val link = itemCatalogue[bindingAdapterPosition]
                Intent(context, DetailItemActivity::class.java).apply {
                    putExtra("imageUri", link)
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                }.run { context.startActivity(this) }
            }
        }
    }

상품 목록을 누르면 해당 상품에 대해 자세한 정보가 뜰 수 있게 하고 싶었습니다. 그 부분은 DetailItemActivity에 세팅하였습니다.

data class로 지정한 ItemInfoDTO에 Serailizable을 세팅해 datas변수로 해당 이미지uri와 일치하는 데이터를 받아옵니다.

datas = intent.getSerializableExtra("imageUri") as ItemInfoDTO
        var user = FirebaseAuth.getInstance().currentUser

        GlideApp.with(this)
            .load(datas.imageUri)
            .into(binding.itemImageDetail)

        FirebaseFirestore.getInstance().collection("Items").whereEqualTo("imageUri", true).get().addOnSuccessListener { documents ->
            binding.itemCategoryDisplay.text = datas.category
            binding.itemNameDisplay.text = datas.item_name
            binding.itemTextDisplay.text = datas.item_text
            binding.itemUserDisplay.text = datas.sellerId
            binding.itemAccountDisplay.text = datas.itemAccount.toString()

            savedocId = datas.docuid
        }.addOnFailureListener {

        }

상품 목록 중 하나를 터치하면 다음 상세 페이지로 넘어가는 것을 확인했습니다. 그런데 터치의 범위가 뭔가 이상합니다. 목록의 중앙 상단을 눌러야만 넘어가는데 이거 무슨 문제인지.... 파악이 필요해 보입니다.

다음은 좋아요 표시와 상품평들을 남기는 댓글을 달아보려고 합니다.

아래는 Adapter의 전체 코드입니다.

//물품 리스트와 연결되어 있는 Adapter
class MysmallAdapter(val context: Context, val itemCatalogue: ArrayList<ItemInfoDTO>) : RecyclerView.Adapter<MysmallAdapter.ViewHolder>(){
    private var TAG = "MysmallAdapter"
    init{
        FirebaseFirestore.getInstance().collection("Items")?.addSnapshotListener{ querySnapshot, firebaseFirestoreException ->
            itemCatalogue.clear()
            for(snapshot in querySnapshot!!.documents){
                var item = snapshot.toObject(ItemInfoDTO::class.java)
                itemCatalogue.add(item!!)
            }
            notifyDataSetChanged()
        }
    }

    // 리스너 인터페이스.
    interface ItemClick{
        fun onClick(v:View, position: Int, item: ItemInfoDTO)
    }

    private var itemClick: MysmallAdapter.ItemClick? = null

    fun setItemClick(itemClick: ItemClick){
        this.itemClick = itemClick
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MysmallAdapter.ViewHolder{
        val cardView = LayoutInflater.from(parent.context).inflate(R.layout.card_layout_small, parent, false)
        return ViewHolder(cardView)
    }

    override fun onBindViewHolder(holder: MysmallAdapter.ViewHolder, position: Int) {
        //val item = itemCatalogue[position]
        holder.bind(itemCatalogue[position])
//        holder.itemView.setOnClickListener {
//            Toast.makeText(context, "카드뷰 클릭됨", Toast.LENGTH_SHORT).show()
//            val link = itemCatalogue[position]
//            Intent(context, DetailItemActivity::class.java).apply {
//                putExtra("imageUri", link.imageUri)
//                addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
//            }.run { context.startActivity(this) }
////
//        }
    }

    //레이아웃 내 View 연결
   inner class ViewHolder(itemView : View): RecyclerView.ViewHolder(itemView){
        private val itemtitle  = itemView?.findViewById<TextView>(R.id.item_title)
        private val itemdetail = itemView?.findViewById<TextView>(R.id.item_detail)
        private val itemImage = itemView?.findViewById<ImageView>(R.id.item_image)
        private val cardView = itemView?.findViewById<CardView>(R.id.card_view_small)

        
        fun bind(item: ItemInfoDTO){
            itemtitle?.text = item.item_name
            itemdetail?.text = item.item_text

            if (itemImage != null) {
                GlideApp.with(itemView)
                    .load(item.imageUri)
                    .into(itemImage)
            }
            cardView?.setOnClickListener { View ->
                Toast.makeText(context, "카드뷰 클릭됨", Toast.LENGTH_SHORT).show()
                Log.e("check", "카드뷰 클릭")
                val link = itemCatalogue[bindingAdapterPosition]
                Intent(context, DetailItemActivity::class.java).apply {
                    putExtra("imageUri", link)
                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                }.run { context.startActivity(this) }
            }
        }
    }

    override fun getItemCount(): Int {
        //return 5
        return itemCatalogue.size
    }
}
profile
뉴비 프로그래머

0개의 댓글