Coverage Summary for Class: AdapterCommonClickData (kr.open.library.simple_ui.xml.ui.adapter.common)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| AdapterCommonClickData |
100%
(1/1)
|
100%
(7/7)
|
62.5%
(10/16)
|
100%
(18/18)
|
93.8%
(106/113)
|
package kr.open.library.simple_ui.xml.ui.adapter.common
import android.view.View
import androidx.recyclerview.widget.RecyclerView
/**
* Shared click/long-click callback container for RecyclerView ViewHolder.<br><br>
* RecyclerView ViewHolder용 클릭/롱클릭 콜백 공통 컨테이너입니다.<br>
*
* @param ITEM Adapter item type.<br><br>
* 어댑터 아이템 타입입니다.<br>
* @param VH RecyclerView ViewHolder type.<br><br>
* RecyclerView ViewHolder 타입입니다.<br>
*/
internal class AdapterCommonClickData<ITEM, VH : RecyclerView.ViewHolder> {
/**
* Item click callback that receives position, item, and clicked view.<br><br>
* position, item, clicked view를 전달하는 아이템 클릭 콜백입니다.<br>
*/
var onItemClickListener: ((Int, ITEM, View) -> Unit)? = null
/**
* Item long-click callback that receives position, item, and clicked view.<br><br>
* position, item, clicked view를 전달하는 아이템 롱클릭 콜백입니다.<br>
*/
var onItemLongClickListener: ((Int, ITEM, View) -> Unit)? = null
/**
* Attaches click listener once per ViewHolder creation and resolves item at click time.<br><br>
* ViewHolder 생성 시 클릭 리스너를 1회 연결하고 아이템은 클릭 시점에 조회합니다.<br>
*
* @param holder Target ViewHolder.<br><br>
* 대상 ViewHolder입니다.<br>
* @param positionMapper Mapper that converts adapter position to callback position.<br><br>
* adapter position을 콜백 position으로 변환하는 매퍼입니다.<br>
* @param itemProvider Provider that returns item from mapped callback position.<br><br>
* 변환된 콜백 position 기준으로 아이템을 조회하는 공급자입니다.<br>
*/
fun attachClickListeners(holder: VH, positionMapper: (Int) -> Int?, itemProvider: (Int) -> ITEM?) {
holder.itemView.setOnClickListener { view ->
val listener = onItemClickListener ?: return@setOnClickListener
val adapterPosition = holder.bindingAdapterPosition
if (adapterPosition == RecyclerView.NO_POSITION) return@setOnClickListener
val callbackPosition = positionMapper(adapterPosition) ?: return@setOnClickListener
val item = itemProvider(callbackPosition) ?: return@setOnClickListener
listener.invoke(callbackPosition, item, view)
}
}
/**
* Attaches long-click listener once per ViewHolder creation and resolves item at long-click time.<br><br>
* ViewHolder 생성 시 롱클릭 리스너를 1회 연결하고 아이템은 롱클릭 시점에 조회합니다.<br>
*
* @param holder Target ViewHolder.<br><br>
* 대상 ViewHolder입니다.<br>
* @param positionMapper Mapper that converts adapter position to callback position.<br><br>
* adapter position을 콜백 position으로 변환하는 매퍼입니다.<br>
* @param itemProvider Provider that returns item from mapped callback position.<br><br>
* 변환된 콜백 position 기준으로 아이템을 조회하는 공급자입니다.<br>
*/
fun attachLongClickListeners(holder: VH, positionMapper: (Int) -> Int?, itemProvider: (Int) -> ITEM?) {
holder.itemView.setOnLongClickListener { view ->
val listener = onItemLongClickListener ?: return@setOnLongClickListener false
val adapterPosition = holder.bindingAdapterPosition
if (adapterPosition == RecyclerView.NO_POSITION) return@setOnLongClickListener false
val callbackPosition = positionMapper(adapterPosition) ?: return@setOnLongClickListener false
val item = itemProvider(callbackPosition) ?: return@setOnLongClickListener false
listener.invoke(callbackPosition, item, view)
true
}
}
}